Advertisement

【scratch】class_3_打砖块小游戏

阅读量:

一、游戏说明

实现一个打砖块的小游戏,基本元素包括小球,挡板,砖块,终点线,分数,背景自选。
基本界面


二、需求分析

1. 小球

  • 小球碰到挡板和墙壁时都要反弹
  • 小球碰到砖块时砖块消失
  • 小球碰到终点线时游戏结束

2. 挡板

  • 挡板随鼠标水平移动,竖直方向位置不变
  • 挡板碰到小球时小球反弹

3. 砖块

  • 砖块在屏幕上方排列整齐
  • 砖块碰到小球时砖块消失

4. 分数

  • 小球碰到砖块使砖块消失时分数加一

5. 终点线

  • 小球碰到终点线时游戏结束

三、设计说明

1. 小球

  • 游戏开始时,小球位于屏幕中间,向某一个方向飞出;这个方向最好不要向下或者斜向下;可适当调整小球的大小和飞行速度
  • 小球碰到挡板和墙壁时都要反弹,且反弹遵守反射定律,入射角和出射角相等

2. 挡板

  • 挡板随鼠标水平移动,竖直方向位置不变

3. 砖块

  • 砖块在屏幕上方排列整齐,三行,每行十个,可使用一个砖块克隆完成
  • 砖块碰到小球时砖块消失

4. 分数

  • 小球碰到砖块使砖块消失时分数加一

5. 终点线

  • 小球碰到终点线时游戏结束

四、代码实现

第一步,选择适当背景;选择‘Ball’作为角色,可以给它改名为‘球’;游戏开始时将小球放在屏幕中间,大小调成50,面向40°方向,重复向前移动,碰到边缘反弹。

小球开始

至此实现了小球的基本运动,效果如图

小球基本运动

第二步,选择‘挡板’为角色,放在坐标(0,-140)处,循环,把它的横坐标设置为鼠标的横坐标,这样它就会在水平方向上随着鼠标移动。

挡板移动

效果如图挡板1

第三步,当小球碰到挡板时,要使小球反弹,且遵循反射定律,先看反射的示意图反射示意1

反过来也是一样的

反射示意2

所以小球撞到挡板后反射需要转过的角度=180° - 方向x2,在小球的代码中添加内容

小球2

效果图

小球2

第四步,添加砖块(难点)

首先添加一个长方体的模型当做砖块,把它放在屏幕左上角的位置并适当调整大小。
砖块1
我们计划排列30个砖块,排成3行,每行10个;由于我们不会去添加30个砖块角色,虽然也能实现,但是非常繁琐。所以我们要用到‘克隆’来实现这个功能,将一个砖块克隆30次就可以了。
砖块2
执行后会发现没有变化,是因为克隆是在“原地”执行的,也就是说克隆出来的30个砖块都叠加在一起了。所以我们要想办法把它们分开,当然不能手动拖拽。
砖块3
我们需要建立两个变量,‘砖块数量’和‘砖块编号’。砖块数量用来记录画面内砖块的数量,适用于所有角色;砖块编号表示每个克隆出来的砖块的编号,仅适用于当前角色。
砖块变量

注意:克隆功能神奇的地方在于,当克隆体被启动时,它就自动拥有了被克隆对象的所有代码;如果建立的变量‘仅适用于当前角色’,那它被克隆体使用时,也将仅适用于此克隆体,而对其它克隆体没影响。我们接下来会举例说明

克隆说明1
为了查看每个砖块的编号是否准确,我们设置点击砖块时显示砖块编号,这样可以方便我们看到效果
砖块3
可以看到砖块都被编号了。那如果砖块编号不是‘仅适用于当前角色’会怎么样呢?会变成这个样子:砖块4
可以看到每个砖块的编号都是30,这是因为我们把砖块编号变成了‘适用于所有角色’,然后把它设置为了砖块数量,而砖块最后的数量就是30。
也可以这样理解

变量类型说明
以上就是对‘适用于所有角色’和‘仅适用于当前角色’的解释。

我们需要对30个砖块进行整齐的排列,这就意味着我们要对每个砖块的位置严格控制。由于砖块刚克隆出来时都重叠在一起,这就需要它们自己“走到”各自对应的位置上,那应该怎么实现呢?假如30个砖块是以以下的方式排列的。砖块排列规律
由上图我们知道了砖块的行数和列数与砖块编号的关系,所以我们需要再创建两个变量 ‘砖块所在行’和‘砖块所在列’来表示他们,然后再克隆体启动时为它们赋值,当然这两个变量也是‘仅适用于当前角色’的。
行列赋值
有了行列关系后,我们需要让每个砖块自己“走到”自己位置上去,这其中的关系如下图所示
砖块移动
按照这个移动逻辑来编辑克隆体移动的代码
砖块移动代码
至此砖块就排列好了。接下来我们要让小球碰到砖块时,砖块消失,而且积分
分数
效果如图
碰撞加分1
但是我们还要实现当小球碰到砖块时也要反弹。这里我们用消息广播的功能,当砖块被小球碰到时,广播一个消息,通知小球反弹。
消息广播
这样我们就发出了一个广播,现在要让小球接收到广播时反弹
接受反弹广播
效果如图
碰到转反弹
最后添加终点线,当小球落到终点线上时使游戏结束
终点线

至此这个游戏就基本完成了,但是其中还有很多细节可以完善,之后会再写一篇说一下。

全部评论 (0)

还没有任何评论哟~