三维 - 物理益智游戏(难度:3级)
-
用到的相关知识
介绍
在这篇教程中,大家将利用物理引擎制作一个三维益智游戏。玩家点击哪个盒子就会删除哪个盒子,目标就是让球滚进篮子里。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c886d5f8-7f1b-4d38-9d9e-76044c84f435.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第1步 - 新建一个项目,带4个空角色
在创益编程游乐场新建一个项目。删除角色“角色1”,把角色“空的1”改名为“主角”。
之后再添加3个空角色,分别命名为“盒子”、“篮筐”和“球”。这样的话,我们就可以利用不同角色为场景中的不同物体编排代码积木。
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/47af2c85-cc92-4713-8ddd-2be331a32b01.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第2步 - 新建一个空场景
现在我们开始编排“主角”的代码。请添加以下积木,将会创建一个空的三维场景并显示三维坐标轴。我们还要把摄像机拉远,以便于看到添加的全部物体。

大家可以用按钮“+”在“三维场景”类别快速添加这些积木:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/e13d48f1-f415-4ce7-ab26-a4a9cd5f0c0c.gif" width="1000" style="border-radius: 5px; border: 1px solid #29622d;">
当你点击绿旗后就得到如下结果:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/ba5f3e13-9d8a-4810-9249-064ffac123eb.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第3步 - 开启物理引擎
若要在项目中使用物理引擎,要先为场景启用物理引擎。我们把重力设为-1000,会让球快速下落。

第4步 - 广播消息“添加盒子”与接收消息
现在该添加盒子了。“主角”角色向“盒子”角色发送消息,“盒子”角色将完成制作盒子的实际工作。
在“主角”角色,添加积木“广播( )并等待”,消息为“添加盒子”。“等待”将确保盒子被成功添加后再继续添加其他物体。

在“盒子”角色中,我们用如下积木接收消息:

第5步 - 添加一个带网格线的盒子
在“盒子”角色中,我们创建第一个盒子,并应用“网格材料”。盒子网格线的颜色可随意挑选。

这些积木将会在场景中央生成一个大小为100的盒子:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b0bd3c36-08fc-4b64-8791-1df281a0d66d.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第6步 - 给盒子添加物理实体
现在为盒子添加物理实体。参数如下:
- 形状:因为我们应用于盒子物体,形状应当为“盒子”。
- 质量:质量设置为0,保证盒子不移动、不旋转。
- 恢复系数:设置一个较大值80%,从而使球在盒子上有较好的弹性。
- 摩擦系数:设置一个较小值30%,从而使球在盒子上滚动时不会减速太多。

第7步 - 从中心矩阵复制
现在我们要把这个盒子复制很多份,5行、5列。积木“从中心矩阵复制”专门用于此用途。注意,有2个积木包含“矩阵复制”,一定要选对。

这个积木会沿x轴左右分别复制2列。同理,会把这些列前后分别复制2行。另外,由于第1个盒子具有物理实体,那么复制出来的全部盒子都具有同样的物理实体。
第8步 - 把网格线移到边缘上
我们发现一个问题就是网格线的帮助不大。我们想要网格线显示盒子边缘,而不是盒子中心。解决办法就是在每个方向上将网格线移动50单位:

现在我们可以清晰看到5行、5列盒子:
第9步 - 上面加一层盒子
接下来,我们要在这一层盒子上方加一层盒子。我们首先添加一个新盒子,然后将其移动到第1个盒子上方。因为第1个盒子的z坐标为0,第2个盒子的z坐标应该为100。

第2个盒子在这里:
第10步 - 修改颜色并复制新盒子
现在我们可以把这个新盒子作为“种子”来制作另一层盒子。大家可以从上方复制三个积木,然后换成其他颜色:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/79506bb3-f7a2-4138-8445-f71e1f03d6c7.gif" width="880" style="border-radius: 5px; border: 1px solid #29622d;">
现在制作出如下两层盒子:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/cac1e337-2537-4a4d-b29f-cde61980a132.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第11步 - 第三层
通过“制作副本”也能快速添加第3层盒子。大家只需要修改z坐标和颜色:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/6316373b-0df4-47ab-a807-8f95623997ce.gif" width="800" style="border-radius: 5px; border: 1px solid #29622d;">
现在我们就做好了全部三层盒子:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/370145a2-9719-410c-a4e9-f8936db22d97.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第12步 - 开启选取事件
我们要让玩家能够点击盒子即可删除。为了做到这一点,我们首先要为盒子开启选取事件:

这个积木会确保“盒子”角色中添加的全部盒子都会响应鼠标选取事件,所以我们不需要一个个盒子去处理。
第13步 - 删除鼠标选中的盒子
每当鼠标选中某个盒子,这个盒子的名称就会保存在变量“被选取物体名字”。因此,我们利用对应的名称删除盒子,如下所示:

现在大家可以尝试点击盒子以删除。注意,仍然可以拖动鼠标指针来旋转摄像机,该操作不会删除盒子。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/b80a1f75-680b-4308-ac36-911fa7444259.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第14步 - 消息“添加球”
现在就该添加球了。首先,我们要从“主角”角色向“球”角色发送一条命令消息。
在“主角”角色中,添加积木“广播( )并等待”,其中的消息为“添加球”:

然后在“球”角色中,添加以下积木来接收消息:
第15步 - 添加一个排球
现在我们在“球”角色中添加一个排球模型。排球大小为190,比两层盒子稍微小一点。我们还要把“z坐标偏移”设置为其高度的一半,也就是95。这是因为所有模型的原点都在其底部,但我们要让排球绕着自身的中心旋转。

第16步 - 移动排球
排球的初始位置为x: 100,y: 100,z: 400

球在盒子上方离开一定距离。球不落下是因为我们还没有给球添加物理实体,所以还不受物理引擎驱动。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/88eba2b6-a962-4a50-abcc-12c369f55825.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第17步 - 给球添加物理实体
现在我们给排球添加一个球形物理实体。“质量”应当设置为1,从而会由于重力下落。“恢复系数”和“摩擦系数”与盒子相同。

添加过物理实体后,排球就会落下并在盒子上弹跳。当我们移除排球下方的盒子,排球会继续下落:
https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/bdeeac83-4732-4607-bd17-be9f34abb077.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第18步 - 消息“添加篮筐”
这个游戏的最后一个物体就是方形篮筐。跟其他物体一样,我们要用一个新消息“添加篮筐”。
在“主角”角色中,广播这条消息:

然后在“篮筐”角色中,接收这条消息:
第19步 - 添加一个方形管子
接下来在“篮筐”角色中用代码积木制作篮筐。
篮筐可以用一个方形管子来制作,4个侧面加1个底。开口大小为200乘200,比排球稍大一点。
为篮筐应用网格材料,然后移动到盒子的前下方:

篮筐如下所示:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/0821ba19-2dc0-4be9-9c1e-3cdb94c5103b.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第20步 - 为篮筐添加物理实体
篮筐用来盛放排球,所以也需要一个物理实体。我们可以用“长方管子”形状,这种形状的物理实体只能用于长方管子。
其“质量”应当为0,这样它就不会移动。“恢复系数”也设置一个较小值,从而使排球不会弹出来。

现在就可以玩游戏了!如果排球滚到篮筐里,就会停在里面。https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/3ff73baf-2071-4c20-9712-190798c9979c.gif" width="480" style="border-radius: 5px; border: 1px solid #29622d;">
第21步 - 检查是否成功
如果玩家未能把球放进篮筐里,可以重新开始游戏。如果球进了篮筐,我们要有一个办法宣布玩家已经成功了。
由于球在篮筐中不会移动,所以我们可以检查2个条件:由于球没有在空中下落,球在z方向的速度应当为0。球的z坐标应当为一个固定值。我们在“球”角色中运行这个积木即可找出z坐标。

因此,我们只需在“球”角色中重复不断检查这二个条件:
第22步 - 添加标签控件“成功!”
当玩家成功后,我们可以显示一个大标签“成功!”,这可以用标签控件来做。请添加“控件”扩展,然后在“球”角色中添加如下积木:

注意:大家首先要运行积木“添加标签”,在舞台上添加标签之后,再添加积木“为控件设置背景”和“为控件设置字体”,并从下拉菜单中选择“标签1”。
第23步 - 调整“添加球”和“添加篮筐”的顺序
如果大家现在运行项目,会发现场景中没有添加篮筐。原因就是,在“主角”角色中我们等着“添加球”完成以后才能添加篮筐。然而,由于消息“添加球”会触发“球”角色中的“重复执行”循环,这个循环永远不会停止,我们就要永远等下去。
若要解决这个问题,请进入“主角”角色,调整这2条消息的顺序:

第24步 - 整理
最后,整理一下场景,在“主角”角色做3个小改动。第一,换成“蓝天”场景。第二,隐藏三维坐标轴。第三,把摄像头的俯视角度设置为65度。

游戏的最终演示效果如下:https://cdncreaticodecom.b-cdn.net/scratch-gui-projects/forum/c886d5f8-7f1b-4d38-9d9e-76044c84f435.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