Day40 ( 游戏设计 ) 反弹球 ( 乒乓球 )

反弹球 ( 乒乓球 )

教学原文参考:反弹球 ( 乒乓球 )

这篇文章会介绍,如何在 Scratch 3 里使用定位、侦测碰到、反弹、数学计算、重复...等积木,实作一个反弹球 ( 类似乒乓球 ) 的小游戏,并且更进一步做到板子以不同速度碰撞到乒乓球时,会改变乒乓球的移动轨迹和角度。

相关文章参考:定位侦测碰到重复反弹数学计算

角色设定

在角色编辑区,删除猫咪角色,使用绘画,绘制球、板子和地板三个新角色 ( 参考:造型与绘图 )。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

下图是三个造型在舞台上排列的大小示意,地板占满整个舞台底部 ( 因为到时候如果球碰到地板,表示扣分或游戏结束 )。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

积木程序原理 ( 球 )

点击「球」角色,先编辑让球「碰到边缘就反弹」的程序:

  • 放入当绿旗被点击积木。
  • 点击绿旗时,将球面朝 135 度,定位在舞台中间正上方 ( 0, 150 )。
  • 使用重复无限次积木,每次重复时「撞到边缘就反弹」,并且移动 10 点。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

完成後点击绿旗,就能看到球在舞台中移动,撞到边缘会反弹。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

接着理解「球碰板子反弹」的原理:

  • 球的入射角大於 0 ( 从左上往右下移动 ),反射角等於「180 - 入射角」。
  • 球的入射角小於 0 ( 从右上往左下移动 ),反射角等於「( 180 + 入射角 ) x -1」。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

按照反弹原理,编辑球碰到板子的程序:

  • 放入「如果...那麽」积木,判断当球碰到板子角色。
  • 接着放入「如果...那麽...否则」积木。
    • 如果「方向 > 0」( 入射角 > 0 ) 时,面朝 ( 反射角 )「180 - 方向」度
    • 否则 ( 方向 <= 0 )时,面朝「( 180 + 方向) x -1」度

Scratch 3 教学 - 反弹球 ( 乒乓球 )

完成後,就能看到球碰到板子反弹。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

由於球是以每次移动「 10 点」为单位进行移动,所以某些情况下,会发生「超过板子」的奇怪状况。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

为了避免这种状况,可以建立一个「反弹修正」的函式处理,点选左侧清单「函式积木」,建立一个函式,命名为「反弹修正」,勾选「执行完毕再更新画面」。

注意,一定要勾选「执行完毕再更新画面」,这个功能可以让函式内不需要等待的程序快速执行,加快画面运行速度。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

「反弹修正」函式的内容,放入一个「重复...直到」积木,每次重复将球的 y 增加 1,直到没有碰到板子为止 (碰到板子不成立 ),接着在原本的程序中「如果碰到板子」的积木里,执行「反弹修正」的函式。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

最後加入「如果...那麽...否则」积木,判断如果碰到地板,就说出「你已经死了」,否则 ( 如果没碰到地板 ),就执行球的移动与碰撞程序。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

积木程序原理 ( 板子 )

编辑「板子」角色的程序,让板子可以跟随滑鼠移动:

  • 放入当绿旗被点击积木。
  • 点击绿旗时,执行重复无限次积木。
  • 每次重复时,将板子的 x 座标定位到滑鼠的 x 座标。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

虽然做到这个步骤,程序已经全部完成,但球只会以「单一角度」反弹或移动,因此可以替板子角色加入「速度」变数,由板子的移动快慢,进一步控制球的反弹角度

首先新增两个变数:

  • ax:0.001 秒之前板子的 x 座标。
  • v:板子的移动速度。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

修改板子的跟随滑鼠移动的程序,每次重复执行:

  • 设定变数 ax 为板子的 x 座标。
  • 等待 0.001 秒
  • 将板子定位到新的滑鼠座标。
  • 设定变数 v 为「新的 x 座标 - ax」。

此处的速度 v 表示 0.001 秒内滑鼠移动的「距离」,0.001 秒内移动距离越大,速度越快

Scratch 3 教学 - 反弹球 ( 乒乓球 )

最後,点击「球」的角色,将变数 v 加入角度的计算里。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

完成效果

完成後,点击绿旗,就能开始进行反弹球的游戏,当板子移动速度越快,就越能改变球的反弹角度。

Scratch 3 教学 - 反弹球 ( 乒乓球 )

范例解答

范例解答:反弹球 ( 乒乓球 )

延伸练习

如果已经熟悉了反弹球 ( 乒乓球 )的原理,还可以尝试更多好玩的作法:

  • 加入「反弹的次数」作为得分。( 解答 )
  • 让球每次反弹後,移动速度「越来越快」。( 解答 )

关於我

大家好,我是 OXXO,是个即将迈入中年的斜杠青年,如果对我有点兴趣(笑,可以与我联系,一起来做点有玩又有创意的东西吧!


<<:  [从0到1] C#小乳牛 练成基础程序逻辑 Day 25 - String操纵术II

>>:  【在 iOS 开发路上的大小事-Day28】透过 Firebase 来管理资料 (Cloud Firestore 篇) Part2

DAY21-导览设计之Navbar

前言: 接下来要来完成我们网站的导览部分了,这里阿森主要分为两个大项目,分别是Navbar和Sid...

[Day26]ISO 27001 附录 A.14 系统获取、开发及维护

A.14 系统获取、开发及维护 A.14.1 资讯系统之安全要求事项 目标:确保资讯安全系跨越整个生...

[Day19 ] Prototype Pollution - Prototype污染

前言 你使用过Prototype,那你知道它可以被污染吗? 正文 概念 Javascript的物件透...

[NestJS 带你飞!] DAY09 - Pipe (上)

什麽是 Pipe? Pipe 经常被用来处理使用者传入的参数,比如:验证参数的正确性、型别的转换等。...

【Day20】建立计数器的Test,并提供测试使用的方法 ୧☉□☉୨!

上一篇我们把计数器Component完成了,这篇要来写这个计数器的测试了! 首先我们要先建立一个属於...