三维物理 - 弹珠游戏(难度:5级)
-
用到的相关知识
介绍
在这篇教程中,我们将利用物理引擎制作一个弹珠游戏:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/078772be-ef33-4015-805b-d9a92bc74114.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个空场景
首先,在创益编程游乐场新建一个项目,删除带小狗的“角色1”,把“空的1”角色改名为“主角”。
在“主角”角色中添加如下积木,将创建一个空的三维场景、显示三维坐标轴并启用物理引擎,物理引擎的重力设置为-1000。

得到如下结果:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/dcab15b1-1272-4bd4-bf5c-3694932d2ee3.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第2步 - 新增4个角色
在这个游戏中,有4种物体:桌子、球、扳机和目标。

如同二维的Scratch项目,每种物体用一个角色来组织代码,是个好理念。因此,我们新增4个角色,分别为“桌子”、“球”、“扳机”和“目标”。

第3步 - 广播4条消息
为了告诉每个角色建造各自的部分,我们要从主角角色广播4条消息:

注意,这些消息我们用的是“广播( )并等待”,这样的话,每一步完成以后才进行下一步。
第4步 - 每个角色接收消息
在这4个新角色中,第1个积木就是“当收到( )”,这样的话,每当主角角色发出消息后,其他角色就知道自己该工作了。
例如,在“桌子”角色中,我们接收消息“添加桌子”:

其他3个角色类似。
第5步 - 添加带三个侧面的方形管子
现在我们编辑“桌子”角色。桌子可以用一个带三个侧面的方形管子制作。我们让下端开口,从而使球有机会滚出桌子。
大家自己决定桌子的大小和颜色。比如,宽500,长1050,高110,边缘厚度可以为50:

添加方形管子的积木如下:
第6步 - 木材材质
大家可以根据喜好为桌子设置材质,使桌子看起来更逼真。例如,大家可以选择材质“木材07”,大小为1000:

得到如下结果:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/327666e1-d40f-4e7b-ab91-a78739d5b57f.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第7步 - 为方形管子设置物理实体
现在我们为方形管子添加物理实体。因为它不动,所以质量设为0。因为我们要让球在边上反弹,所以恢复系数要高,比如80。最后,为了让球碰到边缘后旋转,我们要设置一定的摩擦系数,比如20。

第8步 - 添加一个斜面
接下来,我们在右下角添加一个斜面,就是一个盒子,x/y/z三维度大小为200/50/100。绕z轴旋转到-45度,然后移动到 x坐标160、y坐标-410。最后添加同样的材质。

这一步的积木如下:

第9步 - 为斜面添加物理实体
我们要为斜面添加和方形管子一样的物理实体,从而当弹珠碰到桌子的每一个边缘时都有同样的反弹效果。

第10步 - 将斜面复制到左边
左边需要同样的斜面,用积木“复制到镜像位置”能轻松实现,模式为“左右”:

现在“桌子”角色就完成了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/67303d10-e1f2-4059-b6ce-075bc5b18503.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第11步 - 添加球
现在我们切换至“球”角色来添加球。首先添加一个直径为30的球体,命名为“球”。移动至y坐标-400、z坐标10。自己可以随意添加喜欢的材质。程序如下所示:

得到如下结果:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fbb2ecbc-4276-4d3b-b07c-9ec90145f8f1.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第12步 - 为球添加物理实体
因为球要四处弹跳,所以球的质量应当大于0。那我们用默认质量100就可以了。把恢复系数设为100,会非常有弹性。摩擦系数要小一点,比如20,这样的话,当球碰到其他物体时就会旋转,但不会减速太多。

第13步 - 切换至顶部摄像机视角
现在我们改成从顶部观看整个桌面。大家要切换至“主角”角色,添加积木“设置摄像头”,然后设置距离和视角:

现在看到的视角如下所示。看起来桌面像是立起来的,y轴正方向向上,y轴负方向向下。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7af5f730-74da-4001-bf6d-72029ff54aad.png" width="600" style="border-radius: 5px; border: 1px solid #29622d;">
第14步 - 使球“落下”
现在看起来好像球是悬浮着。为了让球自动向下滚动,我们可以对其物理实体施加y轴负方向的力。切换至“球”角色并添加如下积木:

从现在这个视角看起来球就是“向下落”:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/8a91518b-413d-450c-92fd-26e3d75c0086.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第15步 - 添加扳机盒子
接下来,切换至“扳机”角色,在下部添加一个扳机盒子来托住球和击球。x/y/z三维度大小为150/40/100,然后移动至y坐标-480。大家可以随意挑选材质。

结果如下所示:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/56dde6cc-7f1b-4066-8518-096a061383f1.png" width="400" style="border-radius: 5px; border: 1px solid #29622d;">
第16步 - 为扳机添加物理实体
现在我们为扳机开启物理引擎。我们要将扳机上下移动,但不受球和重力的影响,所以我们把质量也设为0。把恢复系数设为80,从而使球能够反弹,当球落下来后还能托住球。把摩擦系数设为100,这样的话,如果球正在旋转,球就会被弹到不同的方向。

这一步完成后,球会停在扳机上:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/925dd061-cd12-46e7-a2ec-cb140f6cdfab.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第17步 - 添加圆柱体目标
现在我们切换至“目标”角色,添加一些圆柱体作为目标。每当球碰到这些目标,玩家就得分。
添加第1个目标的方法如下,添加一个直径为60、高为100的圆柱体。命名为“10”,即当球碰到这一目标时玩家所得的分数。将其移动到桌面上部,y坐标300,x坐标50。

得到结果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/19395405-f8fe-447f-baeb-f1fa47ccae67.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第18步 - 为目标开启物理引擎
现在我们为这个目标添加圆柱体的物理实体。因为目标不动,所以质量应当为0。把恢复系数设为120,使目标非常有弹性。如果恢复系数大于100,意味着当球撞到目标时会获得额外的能量。此外,把摩擦系数设为100,就会使球旋转。

第19步 - 再添加3个目标
将添加第一个目标的3个积木复制副本,用以添加更多目标。如下所示,这些积木再添加三个圆柱体目标,分别命名为“5”、“4”、“1”。

添加的目标如下所示:
第20步 - 扣动扳机
当玩家按下空格键,我们要快速将扳机下移到y坐标-540。当玩家松开空格键,我们要将其移回初始位置y坐标-480,时间比下移时稍长。
在“扳机”角色添加如下积木:

现在我们就可以用板机打球了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/81bd292f-1253-4318-951e-7bea449c1ac4.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第21步 - 碰到目标时广播消息“击中目标”
每当球碰到目标,我们就要展示一些视觉效果/听觉效果,并且使玩家的得分增加。
若要完成这一事件,每当球碰到目标角色中的物体时就要广播一条碰撞消息。
首先,添加积木“当收到(消息)参数( )”,点击下拉菜单新建一条消息“击中目标”。同时,新建一个变量“击中信息”。

接下来,在“目标”角色添加如下积木(放在添加4个目标的积木下方):
这个积木将确保,每当球碰到任意一个目标时都会广播这一消息。
第22步 - 提取目标名称
当我们收到消息“击中目标”,变量“击中信息”将会告诉我们哪两个物体在哪个位置碰撞了。在这个游戏中,我们只需要知道碰撞的目标的名称,即“击中信息”被逗号分隔开的第2部分。请新建一个变量“目标名称”,用于存放目标的名称:

比如说,“击中信息”所包含的内容为“球,1,22.696,-78.908,9.598”,那么“目标名称”就为“1”。
第23步 - 目标高亮显示
每当目标被球碰到,我们就使它短时间高亮显示白光:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/972b0312-7952-4f8f-a85e-246e3b85de88.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
为了做这个效果,我们要在广播碰撞消息后创建高亮层:
我们还要根据名称选择目标,并将其添加到高亮层,较短时间后再将其移出高亮层:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/e8be8c08-db10-4586-933f-823d891c58b4.png" width="500" style="">
第24步 - 限制球的速度
如果大家一直玩这个游戏,应该会发现一个小问题,有时球太快了,以至于会直接穿过目标或者是桌子边缘。

分步解析,物理引擎把球从位置1向上移到位置3。球从来没接触到粉色目标,所以物理引擎“不知道”两者碰到过。
为了解决这个问题,我们要限制球的速度,从而使球不会穿过目标。为了做到这一点,把如下积木添加到球角色中,使球的速度永远不超过1500:
第25步 - 整理场景
现在游戏就可以玩了。最后再进入主角角色整理一下场景。
首先,隐藏三维坐标轴。
第二,大家可以选一个别的场景,或者添加别的天空作为背景。这要在设置摄像机距离之前完成。
第三,我们可以沿y轴补充一些光,让物体的侧面更明亮。

游戏的最终演示效果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/078772be-ef33-4015-805b-d9a92bc74114.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
创意扩展
大家可以把这个项目扩展成多种形式。一些创意思路如下:
-
不同的目标:大家可以把目标设置成不同的形状/颜色/大小/位置。
-
视觉效果/听觉效果:为了让游戏更好玩,当球碰到目标和桌子边缘时,大家可以播放声音,或者使球高亮。
-
游戏结束:大家可以通过检查球的z坐标来判断球是否掉落到桌子外面,如果是的话,就展示一条消息“游戏结束”。
-
得分:大家可以用一个新变量“得分”记录玩家的得分。每当碰到目标时就增加得分。
-
奖励:大家可以在桌面上添加一些游戏道具,当球碰到道具后就获得奖励。例如,大家还可以再添加一个球,玩家用两个球能碰到更多目标。
-
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