三维物理 - 弹珠游戏(难度:5级)
-
用到的相关知识
介绍
在这篇教程中,我们将利用物理引擎制作一个弹珠游戏:
第1步 - 新建一个空场景
首先,在创益编程游乐场新建一个项目,删除带小狗的“角色1”,把“空的1”角色改名为“主角”。
在“主角”角色中添加如下积木,将创建一个空的三维场景、显示三维坐标轴并启用物理引擎,物理引擎的重力设置为-1000。
得到如下结果:
第2步 - 新增4个角色
在这个游戏中,有4种物体:桌子、球、扳机和目标。
如同二维的Scratch项目,每种物体用一个角色来组织代码,是个好理念。因此,我们新增4个角色,分别为“桌子”、“球”、“扳机”和“目标”。
第3步 - 广播4条消息
为了告诉每个角色建造各自的部分,我们要从主角角色广播4条消息:
注意,这些消息我们用的是“广播( )并等待”,这样的话,每一步完成以后才进行下一步。
第4步 - 每个角色接收消息
在这4个新角色中,第1个积木就是“当收到( )”,这样的话,每当主角角色发出消息后,其他角色就知道自己该工作了。
例如,在“桌子”角色中,我们接收消息“添加桌子”:
其他3个角色类似。
第5步 - 添加带三个侧面的方形管子
现在我们编辑“桌子”角色。桌子可以用一个带三个侧面的方形管子制作。我们让下端开口,从而使球有机会滚出桌子。
大家自己决定桌子的大小和颜色。比如,宽500,长1050,高110,边缘厚度可以为50:
添加方形管子的积木如下:
第6步 - 木材材质
大家可以根据喜好为桌子设置材质,使桌子看起来更逼真。例如,大家可以选择材质“木材07”,大小为1000:
得到如下结果:
第7步 - 为方形管子设置物理实体
现在我们为方形管子添加物理实体。因为它不动,所以质量设为0。因为我们要让球在边上反弹,所以恢复系数要高,比如80。最后,为了让球碰到边缘后旋转,我们要设置一定的摩擦系数,比如20。
第8步 - 添加一个斜面
接下来,我们在右下角添加一个斜面,就是一个盒子,x/y/z三维度大小为200/50/100。绕z轴旋转到-45度,然后移动到 x坐标160、y坐标-410。最后添加同样的材质。
这一步的积木如下:
第9步 - 为斜面添加物理实体
我们要为斜面添加和方形管子一样的物理实体,从而当弹珠碰到桌子的每一个边缘时都有同样的反弹效果。
第10步 - 将斜面复制到左边
左边需要同样的斜面,用积木“复制到镜像位置”能轻松实现,模式为“左右”:
现在“桌子”角色就完成了:
第11步 - 添加球
现在我们切换至“球”角色来添加球。首先添加一个直径为30的球体,命名为“球”。移动至y坐标-400、z坐标10。自己可以随意添加喜欢的材质。程序如下所示:
得到如下结果:
第12步 - 为球添加物理实体
因为球要四处弹跳,所以球的质量应当大于0。那我们用默认质量100就可以了。把恢复系数设为100,会非常有弹性。摩擦系数要小一点,比如20,这样的话,当球碰到其他物体时就会旋转,但不会减速太多。
第13步 - 切换至顶部摄像机视角
现在我们改成从顶部观看整个桌面。大家要切换至“主角”角色,添加积木“设置摄像头”,然后设置距离和视角:
现在看到的视角如下所示。看起来桌面像是立起来的,y轴正方向向上,y轴负方向向下。
第14步 - 使球“落下”
现在看起来好像球是悬浮着。为了让球自动向下滚动,我们可以对其物理实体施加y轴负方向的力。切换至“球”角色并添加如下积木:
从现在这个视角看起来球就是“向下落”:
第15步 - 添加扳机盒子
接下来,切换至“扳机”角色,在下部添加一个扳机盒子来托住球和击球。x/y/z三维度大小为150/40/100,然后移动至y坐标-480。大家可以随意挑选材质。
结果如下所示:
第16步 - 为扳机添加物理实体
现在我们为扳机开启物理引擎。我们要将扳机上下移动,但不受球和重力的影响,所以我们把质量也设为0。把恢复系数设为80,从而使球能够反弹,当球落下来后还能托住球。把摩擦系数设为100,这样的话,如果球正在旋转,球就会被弹到不同的方向。
这一步完成后,球会停在扳机上:
第17步 - 添加圆柱体目标
现在我们切换至“目标”角色,添加一些圆柱体作为目标。每当球碰到这些目标,玩家就得分。
添加第1个目标的方法如下,添加一个直径为60、高为100的圆柱体。命名为“10”,即当球碰到这一目标时玩家所得的分数。将其移动到桌面上部,y坐标300,x坐标50。
得到结果如下:
第18步 - 为目标开启物理引擎
现在我们为这个目标添加圆柱体的物理实体。因为目标不动,所以质量应当为0。把恢复系数设为120,使目标非常有弹性。如果恢复系数大于100,意味着当球撞到目标时会获得额外的能量。此外,把摩擦系数设为100,就会使球旋转。
第19步 - 再添加3个目标
将添加第一个目标的3个积木复制副本,用以添加更多目标。如下所示,这些积木再添加三个圆柱体目标,分别命名为“5”、“4”、“1”。
添加的目标如下所示:
第20步 - 扣动扳机
当玩家按下空格键,我们要快速将扳机下移到y坐标-540。当玩家松开空格键,我们要将其移回初始位置y坐标-480,时间比下移时稍长。
在“扳机”角色添加如下积木:
现在我们就可以用板机打球了:
第21步 - 碰到目标时广播消息“击中目标”
每当球碰到目标,我们就要展示一些视觉效果/听觉效果,并且使玩家的得分增加。
若要完成这一事件,每当球碰到目标角色中的物体时就要广播一条碰撞消息。
首先,添加积木“当收到(消息)参数( )”,点击下拉菜单新建一条消息“击中目标”。同时,新建一个变量“击中信息”。
接下来,在“目标”角色添加如下积木(放在添加4个目标的积木下方):
这个积木将确保,每当球碰到任意一个目标时都会广播这一消息。
第22步 - 提取目标名称
当我们收到消息“击中目标”,变量“击中信息”将会告诉我们哪两个物体在哪个位置碰撞了。在这个游戏中,我们只需要知道碰撞的目标的名称,即“击中信息”被逗号分隔开的第2部分。请新建一个变量“目标名称”,用于存放目标的名称:
比如说,“击中信息”所包含的内容为“球,1,22.696,-78.908,9.598”,那么“目标名称”就为“1”。
第23步 - 目标高亮显示
每当目标被球碰到,我们就使它短时间高亮显示白光:
为了做这个效果,我们要在广播碰撞消息后创建高亮层:
我们还要根据名称选择目标,并将其添加到高亮层,较短时间后再将其移出高亮层:
第24步 - 限制球的速度
如果大家一直玩这个游戏,应该会发现一个小问题,有时球太快了,以至于会直接穿过目标或者是桌子边缘。
分步解析,物理引擎把球从位置1向上移到位置3。球从来没接触到粉色目标,所以物理引擎“不知道”两者碰到过。
为了解决这个问题,我们要限制球的速度,从而使球不会穿过目标。为了做到这一点,把如下积木添加到球角色中,使球的速度永远不超过1500:
第25步 - 整理场景
现在游戏就可以玩了。最后再进入主角角色整理一下场景。
首先,隐藏三维坐标轴。
第二,大家可以选一个别的场景,或者添加别的天空作为背景。这要在设置摄像机距离之前完成。
第三,我们可以沿y轴补充一些光,让物体的侧面更明亮。
游戏的最终演示效果如下:
创意扩展
大家可以把这个项目扩展成多种形式。一些创意思路如下:
-
不同的目标:大家可以把目标设置成不同的形状/颜色/大小/位置。
-
视觉效果/听觉效果:为了让游戏更好玩,当球碰到目标和桌子边缘时,大家可以播放声音,或者使球高亮。
-
游戏结束:大家可以通过检查球的z坐标来判断球是否掉落到桌子外面,如果是的话,就展示一条消息“游戏结束”。
-
得分:大家可以用一个新变量“得分”记录玩家的得分。每当碰到目标时就增加得分。
-
奖励:大家可以在桌面上添加一些游戏道具,当球碰到道具后就获得奖励。例如,大家还可以再添加一个球,玩家用两个球能碰到更多目标。
-