三维物理 - 蹦蹦球游戏(难度:3级)
-
用到的相关知识
介绍
在本篇教程中,大家将利用物理引擎制作一个三维游戏。如下所示,玩家可以移动、旋转一个反弹板,让球落到目标平台上。
第1步 - 新建一个空场景
首先,在创益编程游乐场新建一个项目,删除角色1,然后添加如下积木,将创建一个空的三维场景,显示三维坐标轴,并将摄像机距离设置为800。
得到如下空场景:
第2步 - 为场景启用物理引擎
在场景中使用物理引擎之前,我们必须要启用物理引擎。把场景的重力设置为-500,会让球落得很快。
第3步 - 广播3条消息
这个游戏有3个主要部件:反弹板、球和目标平台。为了让项目更有条理,我们广播3条消息,每一步骤一条:
注意:前2条消息我们用的是“广播( )并等待”,以便于板和目标都添加好以后我们才添加球。
第4步 - 添加3个空角色
用多个角色来组织代码也是个好办法。在这个项目中,我们为3个物体创建3个角色:“板”、“目标”和“球”。
添加空角色的方法就是,鼠标移至右下角的圆按钮上,在弹出菜单中选择“绘制”。
第5步 - 制作反弹板
现在我们在“板”角色中添加一个盒子作为反弹板。
当该角色收到消息“添加板”,就会添加一个盒子,大小为100×100×30。大家可以随意选择一种颜色。还要绕y轴顺时针旋转30度:
要在“板”角色中添加如下积木:
第6步 - 为反弹板添加物理实体
尽管我们可以看到这个盒子,但物理引擎“看不到”,因为物理引擎只作用于物理实体。因此,我们要为这个盒子添加物理实体,设置为“盒子”形状。因为我们不想让盒子受重力而降落,所以要将其“质量”设置为0。另一方面,因为我们要让球在这个板上反弹,所以要把恢复系数设置为100%。
添加物理实体的积木如下:
第7步 - 使板可拖动
在这个游戏中,我们要让玩家能够四处拖动反弹板。我们可以用如下积木为盒子开启拖动。注意,我们要让玩家只能改变盒子的x坐标和z坐标,所以拖动模式要设置为“平面”,方向设置为y轴方向。这样就能确保盒子能够在x方向和z方向上拖动,但其y坐标永远为0,保持不变。
现在大家就可以像下面这样拖动盒子了:
注意,大家仍然可以拖动背景绕摄像机旋转。
第8步 - 使反弹板旋转
除了移动反弹板,我们还可以让玩家能够旋转反弹板,让玩家在设计球的反弹路径上有更多选择。
为了与拖动区分开来,当点击时我们旋转反弹板。在三维项目中,这可以用“选取事件”来实现。提示,“选取”与“拖动”的区别在于,鼠标指针是否在同一个地方按下并松开。
在“板”角色中,我们需要开启选取事件,然后编写选取事件。具体来说就是,我们将选中被鼠标点击的物体,然后将其绕y轴轻微旋转。
现在大家就可以移动和旋转这个板了:
第9步 - 添加目标平台
接下来,我们切换至“目标”角色。当该角色收到消息“添加目标”,就会添加2个盒子作为球的目标平台。如果球停在这个平台上而不落下,游戏就算成功。
为了简单起见,我们把这两个盒子的恢复系数都设为0,这样的话,球落到上面就不会反弹。
第10步 - 添加球
现在我们准备要在“球”角色中添加球了。
当该角色收到消息“添加球”,就添加一个大小为50的球。大家可以随意选择一种喜欢的颜色。我们让球从z坐标为200的地方落下。因为我们要让球下落,所以球的质量不能为0。恢复系数要设为100,以便于从反弹板上反弹。
球落下的情景:
第11步 - 接连不断地丢下小球
在游戏成功之前,玩家要一直调整反弹板,尝试不同的位置。为了让游戏简单点,我们每5秒丢下一个球,这样的话,玩家就无需点击按钮重新开始。
我们用一个无限循环不断丢下新的球。为了避免场景中有太多球,我们用一个小技巧:我们把球命名为“球”,那么,当我们要添加相同名称的新球时,原有的“球”物体就被删除。
现在这个游戏就可以不停地玩了:
第12步 - 球的z坐标
我们的游戏将一直持续到玩家成功将球反弹到目标平台上。球停到目标平台上之后我们就要停止游戏。
为了判断球是否成功停在平台上,我们可以检查球的z坐标。如果球停在目标平台上没有落下,其z坐标应当为一个固定值。
我们通过将球的z坐标打印到控制台面板上来找出其z坐标。注意,我们获取的是球的物理实体的z坐标,因为当球被物理实体控制时球本身的z坐标不变。
运行这段程序获取z坐标:
结果证明,当球停在目标平台上时,其z坐标约为-170。提示,我们也可以计算出这个数值:目标盒子位于-200,其厚度为10,所以它的上表面的z坐标为-195。球的半径为25,那么球的中心位置为-195 + 25 = -170。
第13步 - 判断游戏成功与否
现在我们根据球的物理实体的z坐标来判断玩家是否成功。我们需要将z坐标取整并与-170对比。
当我们判定球停在目标平台上后,可以用一个标签控件来显示成功消息。我们还要终止无限循环,就不再生成新的球。
成功消息如下:
第14步 - 整理代码
把游戏做好了,现在该整理一下代码。在“空的1”角色中,我们应当隐藏三维坐标系,并换成一个更好看的场景,比如“蓝天”。
游戏的最终演示效果如下:
创意扩展
大家可以把这个游戏改编成多种形式。下面是一些思路:
-
多个反弹板:大家可以为玩家提供多个反弹板,并设计游戏等级,玩家必须用上所有反弹板并让球落到目标平台上。
-
不同的反弹板类型:大家可以为反弹板设置不同的恢复系数。此外,当点击反弹板时,大家可以使它绕x轴或z轴旋转,而不绕y轴旋转。
-
障碍物:大家可以再添加一种物体作为障碍物,玩家无法移动和转动障碍物。这会让游戏更有趣。
-