三维物理 - 蹦蹦球游戏(难度:3级)
-
用到的相关知识
介绍
在本篇教程中,大家将利用物理引擎制作一个三维游戏。如下所示,玩家可以移动、旋转一个反弹板,让球落到目标平台上。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b9849da0-f1eb-4fda-84c2-dec63e5d6c1b.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个空场景
首先,在创益编程游乐场新建一个项目,删除角色1,然后添加如下积木,将创建一个空的三维场景,显示三维坐标轴,并将摄像机距离设置为800。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c7b5a71f-14ab-48b0-b615-b6c32a1d26cf.png" width="1000" style="">
得到如下空场景:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d876baf7-7fff-46cc-99c4-c8b2e36c397f.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第2步 - 为场景启用物理引擎
在场景中使用物理引擎之前,我们必须要启用物理引擎。把场景的重力设置为-500,会让球落得很快。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7e3d7036-ffb0-4a66-9964-d4d941c2b4e4.png" width="800" style="">
第3步 - 广播3条消息
这个游戏有3个主要部件:反弹板、球和目标平台。为了让项目更有条理,我们广播3条消息,每一步骤一条:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3c4fa539-7be6-45d4-874b-7a16bedb627d.png" width="800" style="">
注意:前2条消息我们用的是“广播( )并等待”,以便于板和目标都添加好以后我们才添加球。
第4步 - 添加3个空角色
用多个角色来组织代码也是个好办法。在这个项目中,我们为3个物体创建3个角色:“板”、“目标”和“球”。
添加空角色的方法就是,鼠标移至右下角的圆按钮上,在弹出菜单中选择“绘制”。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/62b6734d-d6df-434b-80ef-e811a75da71b.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第5步 - 制作反弹板
现在我们在“板”角色中添加一个盒子作为反弹板。
当该角色收到消息“添加板”,就会添加一个盒子,大小为100×100×30。大家可以随意选择一种颜色。还要绕y轴顺时针旋转30度:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/162c08bd-deca-4742-b874-a0887bf257cf.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
要在“板”角色中添加如下积木:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/139178f2-56e9-45b8-aa99-e4d20061720b.png" width="600" style="">
第6步 - 为反弹板添加物理实体
尽管我们可以看到这个盒子,但物理引擎“看不到”,因为物理引擎只作用于物理实体。因此,我们要为这个盒子添加物理实体,设置为“盒子”形状。因为我们不想让盒子受重力而降落,所以要将其“质量”设置为0。另一方面,因为我们要让球在这个板上反弹,所以要把恢复系数设置为100%。
添加物理实体的积木如下:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fb56f683-88d3-4895-98d2-d476499c5a6a.png" width="800" style="">
第7步 - 使板可拖动
在这个游戏中,我们要让玩家能够四处拖动反弹板。我们可以用如下积木为盒子开启拖动。注意,我们要让玩家只能改变盒子的x坐标和z坐标,所以拖动模式要设置为“平面”,方向设置为y轴方向。这样就能确保盒子能够在x方向和z方向上拖动,但其y坐标永远为0,保持不变。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/74532ad9-ebb0-4b9d-9fd7-3be61d2f33b9.png" width="800" style="">
现在大家就可以像下面这样拖动盒子了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/001d6526-c39d-43ad-b2e3-43cf671391d1.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
注意,大家仍然可以拖动背景绕摄像机旋转。
第8步 - 使反弹板旋转
除了移动反弹板,我们还可以让玩家能够旋转反弹板,让玩家在设计球的反弹路径上有更多选择。
为了与拖动区分开来,当点击时我们旋转反弹板。在三维项目中,这可以用“选取事件”来实现。提示,“选取”与“拖动”的区别在于,鼠标指针是否在同一个地方按下并松开。
在“板”角色中,我们需要开启选取事件,然后编写选取事件。具体来说就是,我们将选中被鼠标点击的物体,然后将其绕y轴轻微旋转。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/51b1275b-edb3-4dd0-9f58-7070b4044a27.png" width="800" style="">
现在大家就可以移动和旋转这个板了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/f5aba4f9-bb8b-49aa-8601-3644ae0aa7bf.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第9步 - 添加目标平台
接下来,我们切换至“目标”角色。当该角色收到消息“添加目标”,就会添加2个盒子作为球的目标平台。如果球停在这个平台上而不落下,游戏就算成功。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/11be4ed5-6045-4c20-9b24-7025e7d4599f.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
为了简单起见,我们把这两个盒子的恢复系数都设为0,这样的话,球落到上面就不会反弹。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/1de26fc6-f40d-49b4-9554-917b07e2e0a7.png" width="800" style="">
第10步 - 添加球
现在我们准备要在“球”角色中添加球了。
当该角色收到消息“添加球”,就添加一个大小为50的球。大家可以随意选择一种喜欢的颜色。我们让球从z坐标为200的地方落下。因为我们要让球下落,所以球的质量不能为0。恢复系数要设为100,以便于从反弹板上反弹。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4d7fd535-1632-44c8-bdef-4320b7482113.png" width="1000" style="">
球落下的情景:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/9ed5fa97-dca6-4059-b0e0-202cbb98aaa4.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第11步 - 接连不断地丢下小球
在游戏成功之前,玩家要一直调整反弹板,尝试不同的位置。为了让游戏简单点,我们每5秒丢下一个球,这样的话,玩家就无需点击按钮重新开始。
我们用一个无限循环不断丢下新的球。为了避免场景中有太多球,我们用一个小技巧:我们把球命名为“球”,那么,当我们要添加相同名称的新球时,原有的“球”物体就被删除。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b0189a16-63e1-4447-a548-88f492fbc0a1.png" width="800" style="">
现在这个游戏就可以不停地玩了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/f6974e06-9f19-4947-b2f9-116871365c58.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第12步 - 球的z坐标
我们的游戏将一直持续到玩家成功将球反弹到目标平台上。球停到目标平台上之后我们就要停止游戏。
为了判断球是否成功停在平台上,我们可以检查球的z坐标。如果球停在目标平台上没有落下,其z坐标应当为一个固定值。
我们通过将球的z坐标打印到控制台面板上来找出其z坐标。注意,我们获取的是球的物理实体的z坐标,因为当球被物理实体控制时球本身的z坐标不变。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/359acc94-2154-4b37-aea4-08c930ba7a8d.png" width="600" style="">
运行这段程序获取z坐标:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/9c455fbc-a390-4f1b-b583-f5c4b479c9ef.gif" width="1200" style="border-radius: 5px; border: 1px solid #29622d;">
结果证明,当球停在目标平台上时,其z坐标约为-170。提示,我们也可以计算出这个数值:目标盒子位于-200,其厚度为10,所以它的上表面的z坐标为-195。球的半径为25,那么球的中心位置为-195 + 25 = -170。
第13步 - 判断游戏成功与否
现在我们根据球的物理实体的z坐标来判断玩家是否成功。我们需要将z坐标取整并与-170对比。
当我们判定球停在目标平台上后,可以用一个标签控件来显示成功消息。我们还要终止无限循环,就不再生成新的球。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/73130c8a-bbd0-4a3b-accb-b5c87f1c4796.png" width="1000" style="">
成功消息如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/f6ba6ca6-a5e7-4bb8-9080-391fb3964e69.png" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
第14步 - 整理代码
把游戏做好了,现在该整理一下代码。在“空的1”角色中,我们应当隐藏三维坐标系,并换成一个更好看的场景,比如“蓝天”。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/80da6d4b-9402-4d00-8958-760f80d94d92.png" width="800" style="">
游戏的最终演示效果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b9849da0-f1eb-4fda-84c2-dec63e5d6c1b.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
创意扩展
大家可以把这个游戏改编成多种形式。下面是一些思路:
-
多个反弹板:大家可以为玩家提供多个反弹板,并设计游戏等级,玩家必须用上所有反弹板并让球落到目标平台上。
-
不同的反弹板类型:大家可以为反弹板设置不同的恢复系数。此外,当点击反弹板时,大家可以使它绕x轴或z轴旋转,而不绕y轴旋转。
-
障碍物:大家可以再添加一种物体作为障碍物,玩家无法移动和转动障碍物。这会让游戏更有趣。
-
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login