三维物理 - 迷你台球游戏(难度:4级)
-
用到的相关知识
介绍
在这篇教程中,我们将利用物理引擎制作一个简单的迷你台球游戏。玩家用一个白色的母球把一个红色的目标球打进球袋里。
第1步 - 新建一个项目
在创益编程游乐场新建一个项目。删除带小狗的“角色1”,我们只需要角色“空的1”。
请添加如下积木来初始化一个空场景,开启物理引擎,并设置摄像机和三维坐标轴。
第2步 - 创建3个新积木
请创建3个新积木:
- 添加球桌:用于添加一个带球袋的台球桌;
- 添加球:用于添加台球:
- 检查目标:用于检查目标球是否落入球袋中。
初始化场景之后依次运行这三个积木:
根据积木代码所执行的任务进行组织编排,是个好办法。
第3步 - 添加4个平面
现在我们开始制作台球桌。简单起见,我们将制作一个中间有一个方形球袋的球桌。
首先添加4个平面,然后向对角方向移到4个角:
添加和移动平面的积木如下所示。例如蓝色平面,其中心点的x坐标为5000,是宽度10000的一半,所以它的左边缘与y轴重叠。
第4步 - 移动这4个平面形成一个方形的洞
接下来,我们把每个平面在x和y方向上都移动100,从而在中心形成一个200×200的方形的洞。
代码改动如下。例如,蓝色平面的中心向右移动, X坐标从5000改为5100,那么它的左边缘与y轴的间隙为100。
第5步 - 添加网格材料
现在添加一些网格线,让这4个平面看起来像是一个整体:
应用网格材料的积木如下所示。全部4个平面使用同样的积木。大家可以随意选择颜色:
第6步 - 添加物理实体
现在我们还需要为这4个平面添加物理实体,平面可以用“盒子状”的物理实体。因为台球桌不移动,所以“质量”应当为0。并且,为了模拟真正的台球桌,我们要设置较低的恢复系数和较高的摩擦系数。
4个平面都添加如下积木:
第7步 - 制作球袋底部
一旦球落入方形球袋中,我们就要使球停在里面。要做到这一点,我们可以在桌面下方90的地方添加一个方形平面。因为球的直径为100,这可以保证球会停在球袋中。
球袋底部的恢复系数应当为零,从而使球不会跳出来。还应当为静止的,所以质量为0。添加球袋底部的三个积木如下:
第8步 - 制作目标球
我们做好了球桌,现在去编辑积木“添加球”。首先,我们添加一个红色的球,命名为“目标球”。为了让球看起来像是个塑料球,我们可以修改其光泽度和亮度:
添加球的积木如下所示:
第9步 - 为目标球添加物理实体
我们把球的质量设为100,从而使它被碰撞后会移动。我们还要把恢复系数设置高一些,以便于当母球碰到它后速度会比较快。另外,我们还要让目标球静止,在我们击球前使它不移动。当我们击球后会解除静止状态。
第10步 - 制作母球
接下来我们添加一个白色的“母球”:
添加母球的积木非常相似,与目标球的物理实体完全相同。
第11步 - 添加一个瞄准球
为了帮助玩家指定将母球瞄准哪里,我们添加一个黄色的“瞄准球”。我们将把母球射向这个瞄准球。因为瞄准球并不是真的,我们使它部分透明,还要让用户能够在桌子上拖动这个球。注意,因为瞄准球也有物理实体,所以当我们拖动时不会与目标球重叠。另外,因为目标球是静止的,所以瞄准球不会影响目标球的位置。
添加瞄准球的积木如下:
第12步 - 添加新控件
现在我们要让玩家能够击球。首先,添加3个控件供玩家操作:
- 一个滑动条,让玩家指定击母球的速度;
- 按钮“击球”,用球杆击母球;
- 按钮“重置”,重新玩。
添加控件的积木如下:
第13步 - 击母球
当玩家点击按钮“击球”,我们就应当把母球射向目标球。我们可以利用滑动条的数值设置母球的物理实体的速度,积木如下:
不过,当我们点击按钮“击球”,母球根本不动。原因就是,我们创建母球和目标球的时候把二者都设置成了静止。因此,我们要首先解除静止:
现在母球就能发射出去了:
还有个问题。黄色的瞄准球只是用来帮我们瞄准母球,并不让它撞到目标球。因此,当母球被击出后,我们就要删除瞄准球。完整代码如下:
现在母球就会向瞄准球移动,然后碰撞目标球:
第14步 - 重置球
当点击按钮“重置”时,我们应当使球归位,让玩家重新玩。这一步其实很简单:我们只需要再次运行积木“添加球”。因为这3个球都有名称,当我们重新创建这3个球时,原来的球就自动被移除。
当你点击“重置”时的情景如下:
第15步 - 恢复瞄准球的位置
当玩家击球并点击“重置”后,最好是把瞄准球放在玩家之前瞄准的地方。这样的话,玩家就可以根据上一次的尝试继续调整瞄准球的位置。
要实现这一点,我们要做3个改动:
- 新建两个变量“x”和“y”,把初始值设为瞄准球的初始坐标:
- 在积木“添加球”中用这2个变量设置瞄准球的位置:
- 当我们击出母球之后,把瞄准球的新位置存入这2个变量:
做这些改动后,每当我们移动了瞄准球,我们点击“重置”后瞄准球都会回到上一次移动的位置:
第16步 - 检查是否进球
当目标球落入球袋后,我们可以看到其z坐标正好为-40。这是因为球袋底部的z坐标为-90,球的半径为50。
知道了这一点后,我们可以重复不断地检查目标球的z坐标来判断是否进球:
当我们知道进球以后,可以用一个标签展示成功消息。
现在如果我们运行程序,连按钮都不出现了。不要惊慌失措,原因是,积木“检查目标”包含一个无限循环,所以积木“检查目标”后面的所有积木都不运行。为了解决这个问题,我们只需要把积木“检查目标”移到程序的底部:
游戏的最终演示效果如下:
创意扩展
现在大家已经学会了如何制作基本的游戏,可以把这个项目扩展成多种形式,让游戏更好玩。一些创意思路如下:
-
把球放在不同位置:把母球和目标球换个位置。
-
墙和障碍物:大家可以在球桌上放一些其他物体作为墙和障碍物,例如盒子、圆柱体,会阻挡母球和目标球,让游戏更有难度。另一方面,台球有时候需要从这些物体上反弹进入球袋。
-
多个目标球:玩家要把多个球打入球袋。
-
多个球袋:可以添加多个球袋,玩家要选择瞄准哪个球袋。
-
坡道:大家可以在球桌上添加一些坡道,使母球和目标球能够飞起来越过障碍物,或者跳上更高一层的球桌。
-
多个级别:像大多数游戏一样,大家可以设计多种难度级别。当玩家熟练以后,就会喜欢更有难度的级别。