反弹球 ( 乒乓球 )
这篇文章会介绍,如何在 Scratch 里使用定位、侦测碰到、反弹、数学计算、重复...等积木,实作一个反弹球 ( 类似乒乓球 ) 的小游戏,并且更进一步做到板子以不同速度碰撞到乒乓球时,会改变乒乓球的移动轨迹和角度。
角色设定
在角色编辑区,删除猫咪角色,使用绘画,绘制球、板子和地板三个新角色 ( 参考:造型与绘图 )。
下图是三个造型在舞台上排列的大小示意,地板占满整个舞台底部 ( 因为到时候如果球碰到地板,表示扣分或游戏结束 )。
积木程序原理 ( 球 )
点击“球”角色,先编辑让球“碰到边缘就反弹”的程序:
- 放入当绿旗被点击积木。
- 点击绿旗时,将球面朝 135 度,定位在舞台中间正上方 ( 0, 150 )。
- 使用重复无限次积木,每次重复时“撞到边缘就反弹”,并且移动 10 点。
完成后点击绿旗,就能看到球在舞台中移动,撞到边缘会反弹。
接着理解“球碰板子反弹”的原理:
- 球的入射角大于 0 ( 从左上往右下移动 ),反射角等于“180 - 入射角”。
- 球的入射角小于 0 ( 从右上往左下移动 ),反射角等于“( 180 + 入射角 ) x -1”。
按照反弹原理,编辑球碰到板子的程序:
- 放入“如果...那么”积木,判断当球碰到板子角色。
- 接着放入“如果...那么...否则”积木。
- 如果“方向 > 0”( 入射角 > 0 ) 时,面朝 ( 反射角 )“180 - 方向”度。
- 否则 ( 方向 <= 0 )时,面朝“( 180 + 方向) x -1”度。
补充说明,如果使用“方向 > 0”的公式,套用到“方向 <= 0”的角度,会产生“大于 180 的角度”,当出现大于 180 角度的数值时,Scratch 会将其变成“负值”( 180 - 该数值 ),所以可以将上述积木简化成“180 - 方向”一块即可。
完成后,就能看到球碰到板子反弹。
由于球是以每次移动“ 10 点”为单位进行移动,所以某些情况下,会发生“超过板子”的奇怪状况。
为了避免这种状况,可以建立一个“反弹修正”的函数处理,点选左侧清单“函数积木”,建立一个函数,命名为“反弹修正”,勾选“执行完毕再更新画面”。
注意,一定要勾选“执行完毕再更新画面”,这个功能可以让函数内不需要等待的程序快速执行,加快画面运行速度。
“反弹修正”函数的内容,放入一个“重复...直到”积木,每次重复将球的 y 增加 1,直到没有碰到板子为止 (碰到板子不成立 ),接着在原本的程序中“如果碰到板子”的积木里,执行“反弹修正”的函数。
最后加入“如果...那么...否则”积木,判断如果碰到地板,就说出“你已经死了”,否则 ( 如果没碰到地板 ),就执行球的移动与碰撞程序。
积木程序原理 ( 板子 )
编辑“板子”角色的程序,让板子可以跟随鼠标移动:
- 放入当绿旗被点击积木。
- 点击绿旗时,执行重复无限次积木。
- 每次重复时,将板子的 x 座标定位到鼠标的 x 座标。
虽然做到这个步骤,程序已经全部完成,但球只会以“单一角度”反弹或移动,因此可以替板子角色加入“速度”变数,由板子的移动快慢,进一步控制球的反弹角度。
首先新增两个变数:
- ax:0.001 秒之前板子的 x 座标。
- v:板子的移动速度。
修改板子的跟随鼠标移动的程序,每次重复执行:
- 设定变数 ax 为板子的 x 座标。
- 等待 0.001 秒。
- 将板子定位到新的鼠标座标。
- 设定变数 v 为“新的 x 座标 - ax”。
此处的速度 v 表示 0.001 秒内鼠标移动的“距离”,0.001 秒内移动距离越大,速度越快。
最后,点击“球”的角色,将变数 v 加入角度的计算里。
完成效果
完成后,点击绿旗,就能开始进行反弹球的游戏,当板子移动速度越快,就越能改变球的反弹角度。
范例解答
范例解答:反弹球 ( 乒乓球 )
延伸练习
如果已经熟悉了反弹球 ( 乒乓球 )的原理,还可以尝试更多好玩的作法:
微信扫码关注
抖音扫码关注