在本教程中,你将使用物理引擎制作一个有趣的篮球游戏:
final.gif
游戏的想法是,篮球通过一根绳子连接到空中的一个挂钩上,就像蜘蛛侠一样向前摆动。玩家可以决定何时添加或移除这根绳子,让球落入篮筐。
首先,请在CreatiCode游乐场上创建一个新项目,删除小狗的角色Sprite1,并将“Empty1”角色重命名为“Main”(主角色)。
在Main角色中,添加以下积木块。它们将创建一个带有蓝天的3D场景,显示3D坐标轴,并用-500的重力启用物理效果。
df9acde5-8627-414e-9849-f931cdd9bc0e-image.png
你应该会看到:
在这个游戏中,4个关键部件是篮筐、中间的挂钩、篮球和它的支架。让我们制作这4个新积木来组织我们的代码:
c44f76b4-d098-40c1-bbd2-10363ff17069-image.png
为了盛装篮球,我们可以使用顶部开口的矩形管。以下3个积木将添加一个尺寸为150x150,深度为80的矩形管。我们使用“矩形管”形状为其添加物理实体,并将其质量设为0,让它悬浮在空中。把回弹设为0,这样球就不会弹出来,摩擦设为100%会减慢球的旋转速度。我们用白色线条在绿色网格上绘制。
278af8bd-41a4-48e9-b1e4-a677b7a13f61-image.png
你会得到这样的篮筐:
s1.gif
接下来,我们沿Y轴向前移动篮筐,让球有足够的摆动空间。还要让篮筐绕X轴旋转45度,这样它的开口就会面向我们。
f12978f2-1e93-462e-92f1-513caf9a7b1c-image.png
现在篮筐的位置是这样的:
s1.gif
现在让我们添加挂钩。我们将用一个圆环来表示挂钩。由于没有“圆环”形状的物理实体,我们可以简单地使用“球体”或“盒子”形状。因为挂钩不会与其他物体碰撞,形状并不重要。把质量设为0,让它保持不动。回弹和摩擦的值也不重要。你可以为它添加任何颜色的网格材质。
b0d0d741-0fac-47e9-ab50-c3d751582ad4-image.png
它应该看起来像这样:
s1.gif
挂钩需要被移动得更高,这样它可以帮助球摆动更长的距离。还要让它竖直站立。这两个积木可以做到:
676392e9-63c6-4e79-8b45-a4fe10b19ef8-image.png
现在挂钩看起来是这样的:
s1.gif
球的支架是一个放在球下面的小平面。当游戏开始时,球会在支架上弹跳,直到用户将球连接到挂钩。
我们将支架放在Y位置为-500的地方,这样当连接到挂钩时,球会向前摆动。支架的回弹设为100%,以保持球反弹。
f282cc1c-e7fb-42d4-8c9c-7fdffced1b32-image.png
支架会看起来像这样:
s1.gif
最后一个部件是篮球。注意,它需要被命名,并且需要使用25的Z偏移量,这是它高度的一半。
它将被放在球的支架正上方。回弹设为100%,以保持它从支架上反弹。摩擦设为100%,这样当它落入篮筐时会迅速停止旋转。
0a3f484d-23d7-418a-90d6-c74e47cbf2fb-image.png
现在运行程序,你应该看到一个弹跳的球:
s1.gif
因为球会向前摆动,我们需要添加一个跟随摄像机来跟随球。我们将让摄像机以水平角度45度观察球,这样更容易判断何时连接或断开球与挂钩。我们还将其设置为“自由”模式,这样玩家可以自由调整摄像机。
2d66fc80-ec00-42fc-82a9-b9fc458ee405-image.png
现在球会始终在我们的摄像机视图中心:
s1.gif
为了让玩家连接或断开球与挂钩,我们可以使用按键事件或按钮点击事件。在这种情况下,按钮更好,因为它可以让玩家在手机或iPad上玩,这些设备没有键盘。
以下积木将按钮放在舞台的右下角。因为玩家的第一个动作是连接球与挂钩,我们应该在按钮上显示“连接”。
8a797092-04cc-4470-a85b-848aba41d832-image.png
按钮的默认样式如下:
39a140f0-6d93-416b-a47e-856a74116bd3-image.png
为了让按钮看起来更好,我们可以用这两个积木改变背景和文字样式:
fd2339db-5baf-4585-b726-0750f0b0d6d8-image.png
按钮现在看起来是这样的:
eeed1626-bc15-4cdf-a915-808b9f31dd9a-image.png
现在我们准备好这个项目中最重要的一步了。为了让它看起来像球用一根绳子连接到挂钩,我们需要做两件事。
注意,当我们添加距离约束时,我们需要使用“挂钩”作为第一个输入,因为挂钩是静止的,而球会摆动。“移动的线”会随着球移动,我们可以用“地毯”纹理来更新线条,使其看起来像绳子。
500b7bdc-1a9f-4331-8f5c-7423b438f4c0-image.png
现在如果我们点击“连接”,绳子会出现,看起来球在摆动。
s1.gif
当球在挂钩下摆动时,有时它可能会碰到球的支架:
s1.gif
为了避免这个问题,我们应该在连接球与挂钩时移除球的支架:
0720b6b6-2b6f-47ec-97e1-f70a27a33f52-image.png
当球连接到挂钩后,玩家的下一个动作是断开连接,这会把球投向篮筐。为了让界面简单,我们可以重复使用同一个按钮来执行这个动作。
因为我们使用同一个按钮来执行不同的操作,我们需要一种方法来跟踪当前的“游戏阶段”。在这个游戏中,有3个阶段:
阶段1:从游戏开始到玩家将球连接到挂钩的那一刻; 阶段2:从玩家将球连接到挂钩的那一刻到玩家断开连接的那一刻; 阶段3:球从挂钩上断开后。我们可以使用一个名为“phase”(阶段)的变量来表示当前的阶段。请创建这个新变量,并在游戏开始时将其设为1:
98c2a2ee-3b8f-40ee-b5c8-053efabbf95d-image.png
现在我们可以在按钮被点击时运行不同的代码块。我们已有的代码块应该只在“phase”变量为1时运行:
ba8e8436-c818-404d-8aa0-09ca951380f8-image.png
完成阶段1后,我们应该将“phase”变量设为2,因为我们进入了阶段2。还要把按钮改为显示“断开”,因为玩家需要在阶段2断开绳子:
5efb8b55-bb86-418b-bf8b-78eb756c6f91-image.png
现在,当我们点击它时,按钮会改变文字:
s1.gif
在阶段2,当用户点击按钮时,我们应该移除距离约束和绳子,让球自由飞行。还要移除按钮,因为玩家没有更多的操作。我们也应该将“phase”设为3。
1368190c-1388-42e0-b570-b48a3aa9a3a5-image.png
现在游戏可以玩了!点击“连接”添加绳子,然后点击“断开”投篮:
s1.gif
在阶段3,我们需要检查球是否落入篮筐。我们可以用一个“永久重复”循环每秒检查一次:
47be2a6b-93b4-4067-88a5-6aae5fe95a86-image.png
如果球落入篮筐,它应该停止移动,Z轴的位置应该相对稳定。我们可以直接使用“获取”积木来检查这两个值:
s1.gif
Z轴速度应该接近0,Z轴位置应该大约是-131.8。我们可以用这两个条件来检查是否成功,如果成功就显示一个标签。
9092ebfc-e662-454d-82ba-3ecf4ad36626-image.png
现在我们会得到这样的成功消息:
s1.gif
为了让标签看起来更好,我们可以更新它的背景和文字样式:
2aa365ab-b3eb-415e-adc1-2ed9840166ff-image.png
现在成功消息看起来是这样的:
4f32fc43-8cea-4385-8666-1c38c568afe9-image.png
最后,为了清理一下,我们应该隐藏3D坐标轴:
33663d64-3a95-452e-bf5f-88405fd7db25-image.png
这是游戏的最终演示:
final.gif
你可以用很多方法来扩展这个项目。以下是一些示例想法:
改变参数:你可以将球、挂钩和篮筐移动到不同的位置。你可以改变球或篮筐的大小,或者改变场景的重力。
两个挂钩:在从第一个挂钩断开后,你可以允许玩家在阶段3连接到另一个挂钩,然后在阶段4从它断开。第二个挂钩也可以在不同的方向上。这会让游戏更加有挑战性。下面是一个示例:
障碍物:为了让游戏更加有趣,你可以添加一些静态物体作为障碍物,让玩家必须避开它们。