三维物理 - 迷你台球游戏(难度:4级)
-
用到的相关知识
介绍
在这篇教程中,我们将利用物理引擎制作一个简单的迷你台球游戏。玩家用一个白色的母球把一个红色的目标球打进球袋里。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d1d2ec78-2f72-45fe-ba52-8b756cc312ec.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个项目
在创益编程游乐场新建一个项目。删除带小狗的“角色1”,我们只需要角色“空的1”。
请添加如下积木来初始化一个空场景,开启物理引擎,并设置摄像机和三维坐标轴。

第2步 - 创建3个新积木
请创建3个新积木:
- 添加球桌:用于添加一个带球袋的台球桌;
- 添加球:用于添加台球:
- 检查目标:用于检查目标球是否落入球袋中。
初始化场景之后依次运行这三个积木:

根据积木代码所执行的任务进行组织编排,是个好办法。
第3步 - 添加4个平面
现在我们开始制作台球桌。简单起见,我们将制作一个中间有一个方形球袋的球桌。
首先添加4个平面,然后向对角方向移到4个角:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7001f1c1-1dcd-4ad6-a7d8-2cd67819f8e8.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
添加和移动平面的积木如下所示。例如蓝色平面,其中心点的x坐标为5000,是宽度10000的一半,所以它的左边缘与y轴重叠。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a8394f88-70c4-449b-b298-515cc720c894.png" width="500" style="">
第4步 - 移动这4个平面形成一个方形的洞
接下来,我们把每个平面在x和y方向上都移动100,从而在中心形成一个200×200的方形的洞。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/010a96a0-95ae-4fe9-9502-a533e012e9c5.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
代码改动如下。例如,蓝色平面的中心向右移动, X坐标从5000改为5100,那么它的左边缘与y轴的间隙为100。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/a8efda80-fb1a-408c-ba33-b35d5da014a5.png" width="500" style="">
第5步 - 添加网格材料
现在添加一些网格线,让这4个平面看起来像是一个整体:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/7bb44126-2a83-44cc-8df8-5dbc9b77c55c.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
应用网格材料的积木如下所示。全部4个平面使用同样的积木。大家可以随意选择颜色:
第6步 - 添加物理实体
现在我们还需要为这4个平面添加物理实体,平面可以用“盒子状”的物理实体。因为台球桌不移动,所以“质量”应当为0。并且,为了模拟真正的台球桌,我们要设置较低的恢复系数和较高的摩擦系数。
4个平面都添加如下积木:

第7步 - 制作球袋底部
一旦球落入方形球袋中,我们就要使球停在里面。要做到这一点,我们可以在桌面下方90的地方添加一个方形平面。因为球的直径为100,这可以保证球会停在球袋中。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4f8db5eb-859f-46ec-97d2-32cfbec9de92.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
球袋底部的恢复系数应当为零,从而使球不会跳出来。还应当为静止的,所以质量为0。添加球袋底部的三个积木如下:
第8步 - 制作目标球
我们做好了球桌,现在去编辑积木“添加球”。首先,我们添加一个红色的球,命名为“目标球”。为了让球看起来像是个塑料球,我们可以修改其光泽度和亮度:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b3f752d9-cb77-439a-b995-641e5fbcaa49.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
添加球的积木如下所示:
第9步 - 为目标球添加物理实体
我们把球的质量设为100,从而使它被碰撞后会移动。我们还要把恢复系数设置高一些,以便于当母球碰到它后速度会比较快。另外,我们还要让目标球静止,在我们击球前使它不移动。当我们击球后会解除静止状态。

第10步 - 制作母球
接下来我们添加一个白色的“母球”:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/37c081cf-51f8-45d6-b0b1-9d5f5efc4935.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
添加母球的积木非常相似,与目标球的物理实体完全相同。
第11步 - 添加一个瞄准球
为了帮助玩家指定将母球瞄准哪里,我们添加一个黄色的“瞄准球”。我们将把母球射向这个瞄准球。因为瞄准球并不是真的,我们使它部分透明,还要让用户能够在桌子上拖动这个球。注意,因为瞄准球也有物理实体,所以当我们拖动时不会与目标球重叠。另外,因为目标球是静止的,所以瞄准球不会影响目标球的位置。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fffbefe6-1659-44eb-830b-29c3a2923bab.gif" width="520" style="border-radius: 5px; border: 1px solid #29622d;">
添加瞄准球的积木如下:

第12步 - 添加新控件
现在我们要让玩家能够击球。首先,添加3个控件供玩家操作:
- 一个滑动条,让玩家指定击母球的速度;
- 按钮“击球”,用球杆击母球;
- 按钮“重置”,重新玩。

添加控件的积木如下:
第13步 - 击母球
当玩家点击按钮“击球”,我们就应当把母球射向目标球。我们可以利用滑动条的数值设置母球的物理实体的速度,积木如下:

不过,当我们点击按钮“击球”,母球根本不动。原因就是,我们创建母球和目标球的时候把二者都设置成了静止。因此,我们要首先解除静止:
现在母球就能发射出去了:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/37b3a462-000a-4dc8-8d14-890192a556d1.gif" width="500" style="border-radius: 5px; border: 1px solid #29622d;">
还有个问题。黄色的瞄准球只是用来帮我们瞄准母球,并不让它撞到目标球。因此,当母球被击出后,我们就要删除瞄准球。完整代码如下:
现在母球就会向瞄准球移动,然后碰撞目标球:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ccf09ae2-8a62-4b97-91c8-87a7bcf5e3e2.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第14步 - 重置球
当点击按钮“重置”时,我们应当使球归位,让玩家重新玩。这一步其实很简单:我们只需要再次运行积木“添加球”。因为这3个球都有名称,当我们重新创建这3个球时,原来的球就自动被移除。

当你点击“重置”时的情景如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/4520898f-c037-4258-b041-ff248711d8ec.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第15步 - 恢复瞄准球的位置
当玩家击球并点击“重置”后,最好是把瞄准球放在玩家之前瞄准的地方。这样的话,玩家就可以根据上一次的尝试继续调整瞄准球的位置。
要实现这一点,我们要做3个改动:
- 新建两个变量“x”和“y”,把初始值设为瞄准球的初始坐标:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/fb3e1e1f-8758-4f2d-b76a-8ef2a4f62612.png" width="350" style="">
- 在积木“添加球”中用这2个变量设置瞄准球的位置:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/2c593d01-fd45-40a5-b19a-b4206a36e29d.png" width="700" style="margin-left: 40px">
- 当我们击出母球之后,把瞄准球的新位置存入这2个变量:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bf20379f-ff94-4cb5-87dc-a4a1c4dc4bbf.png" width="700" style="margin-left: 40px">
做这些改动后,每当我们移动了瞄准球,我们点击“重置”后瞄准球都会回到上一次移动的位置:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/cfa3ee9b-31ad-4cc5-a310-27645a8906d5.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
第16步 - 检查是否进球
当目标球落入球袋后,我们可以看到其z坐标正好为-40。这是因为球袋底部的z坐标为-90,球的半径为50。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/0b241f64-0772-454f-bd52-925a623afdf7.gif" width="870" style="border-radius: 5px; border: 1px solid #29622d;">
知道了这一点后,我们可以重复不断地检查目标球的z坐标来判断是否进球:
当我们知道进球以后,可以用一个标签展示成功消息。
现在如果我们运行程序,连按钮都不出现了。不要惊慌失措,原因是,积木“检查目标”包含一个无限循环,所以积木“检查目标”后面的所有积木都不运行。为了解决这个问题,我们只需要把积木“检查目标”移到程序的底部:
游戏的最终演示效果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/d1d2ec78-2f72-45fe-ba52-8b756cc312ec.gif" width="470" style="border-radius: 5px; border: 1px solid #29622d;">
创意扩展
现在大家已经学会了如何制作基本的游戏,可以把这个项目扩展成多种形式,让游戏更好玩。一些创意思路如下:
-
把球放在不同位置:把母球和目标球换个位置。
-
墙和障碍物:大家可以在球桌上放一些其他物体作为墙和障碍物,例如盒子、圆柱体,会阻挡母球和目标球,让游戏更有难度。另一方面,台球有时候需要从这些物体上反弹进入球袋。
-
多个目标球:玩家要把多个球打入球袋。
-
多个球袋:可以添加多个球袋,玩家要选择瞄准哪个球袋。
-
坡道:大家可以在球桌上添加一些坡道,使母球和目标球能够飞起来越过障碍物,或者跳上更高一层的球桌。
-
多个级别:像大多数游戏一样,大家可以设计多种难度级别。当玩家熟练以后,就会喜欢更有难度的级别。
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