Road Rider - 无尽车辆游戏教程
这个教程将帮助你更熟悉GDevelop。在这个教程中,我们的主要重点将是制作一个无尽车辆游戏。玩家应该躲避路上的车辆。游戏还会有一个分数,当我们通过车辆时会自动更新。
下载GDevelop
如果你还没有GDevelop,你可以从GDevelop的官方网站下载。它适用于Windows、macOS和Linux。
下载GDevelop后,你可以进行安装/解压缩,然后启动GDevelop。
你需要一些资产来创建游戏中的对象。你可以在这里下载它们。 下载并解压缩.zip文件到你选择的用作游戏位置的目录。
创建一个新项目
在开始页面上点击创建新项目
。
在弹出的对话框中点击空白游戏
(你可能需要向下滚动找到这个选项),然后选择保存项目的位置。
创建一个新场景
场景
是我们在创建游戏时将大部分时间花在其中的区域。场景基本上是游戏中的一个关卡(或菜单、库存等...)。它包含可以放在屏幕上的对象。
当我们点击空白游戏时,屏幕左侧会出现一个面板。这是项目管理器
。在项目管理器中点击场景
选项。
使用下拉菜单中的点击添加场景
选项创建一个新场景。我们的新场景已经创建。点击NewScene
进入新场景。
创建一个新对象
在右侧的对象
面板中选择点击添加对象
选项。
从添加新对象
弹出窗口中选择精灵
。这将会出现一个对话框。
对象默认被称为NewObject - 你可以在对话框顶部看到这个名称。给每个对象设定一个描述性名称是个好主意,这样当处理它们时就能明白它们是什么。在我们的情况下,使用字段将名称设置为_Car_。
让我们给对象添加一个动画。动画包含在屏幕上显示的图像,适用于精灵对象。
要向对象添加动画,请点击点击添加动画旁边的**+**符号
。
将名称为'car.png'的图像添加为动画,然后点击应用
选项。
类似地,添加一个名为_Highway_的新精灵对象,其中包含图像'highway.png'作为动画。
我们的下一步将是添加4 辆不同的车作为不同的精灵对象。这些将是我们需要躲避的车辆。我们可以将它们命名为_Blue_、Gray、Green 和 Pink,它们的动画将分别使用图像'blue-car.png'、'gray-car.png'、'green-car.png'和'pink-car.png'。从现在开始我们将称这些车辆为'交通车辆'。
创建一个名为_Tree_的新精灵对象,其动画为'tree.png'。这个对象将被用于在游戏进行时创建道路两侧的树木。
创建一个名为_Explosion_的新精灵对象,并选择从'Explosion1.png'到'Explosion8.png'的所有图像。
在这一步结束时,您的场景应该包含8个对象。
为车辆添加上下移动
给车辆添加上下移动行为将允许我们设置其最大速度以及车辆的加速度和减速度。这将使车辆可以缓慢增加速度,而不是从最大速度开始。为此,我们需要打开对象编辑器
。
为此,您可以从对象侧边栏双击_Car_对象,或者点击对象旁边的三个点菜单,然后点击编辑对象。
在面板顶部点击行为
选项卡,然后点击点击将行为添加到对象旁边的**+**按钮
。
在添加一个新行为到对象
弹出窗口中选择上下移动
。
这将打开一个广泛的选项列表。你可以看到与该行为相关的默认值。将减速设为400,并取消选择旋转对象
和默认控件
的选项,然后点击应用
。对于我们的游戏,其他默认值都是可以接受的。
创建一个新事件
一个事件由条件和动作组成。当一组条件为真时,执行相应的动作或一组动作。
在制作游戏时,我们会遇到一些没有条件但有一个或多个动作分配给它们的事件。在这种情况下,动作在每一帧创建时执行。
要添加一个新事件,请从顶部打开NEWSCENE (EVENTS)
选项卡
在事件编辑器工具栏中选择添加新的空事件
选项。
这将创建一个带有空条件和空动作的新事件。
创建Car和Highway的实例
要创建_Car_对象的实例,我们可以从对象面板将对象拖放到场景中并设置我们选择的坐标。
如果您在将对象放到场景上后需要更改对象的坐标,可以通过拖放对象在场景上来实现。
另一种移动对象的方法是通过左侧的对象属性面板中更改X和Y坐标。
您可以选择自己喜欢的值,但如果想要与教程类似的结果,建议使用相同的值。
同样,要创建_Highway_的实例,您可以将对象拖放到场景中并设置其X和Y坐标。
用户可以使用GDevelop提供的预览功能。使用此功能,您可以查看游戏在现实世界中的行为。您可以点击上方的Launch a preview of the scene
图标来预览您的项目。
您应该看到类似于下面显示的图像。
我们发现了一些问题:
- Car 不完全可见。
- Highway 下方的屏幕部分为空。
- Highway 离屏幕中心太远。
使汽车可见
要使汽车可见,我们需要知道它被隐藏在_Highway_下面的原因。答案是Z Order
。
注:
对象的Z Order是决定对象应该显示在前面还是后面的属性。具有特定Z Order的对象将始终显示在低于该值的Z Order的对象的前面,并在高于该值的Z Order的对象的后面。
在我们的情况下,我们可以将_Highway_的Z Order分配为1,_Car_的Z Order分配为2。
创建_Highway_的底部
要创建_Highway_的底部部分,我们可以拉长对象_Highway_的高度。
要做到这一点,您可以点击并拖动_Highway_角落的白色框。
另一种方法是在属性面板中选中Custom size
选项旁边的方框,并输入您选择的高度和宽度。
将游戏移到窗口中心
要将游戏移动到预览窗口的中心,我们将创建我们的第一个事件。
但在此之前,我们需要确定相机的X位置和Y位置。
注意:
对象的坐标表示对象的左上角的位置,而相机的中心坐标是显示窗口的中心。
对于X位置,相机必须位于窗口/高速公路的中心。_Highway_的宽度为535像素。因此,_Highway_的中心位于267.5像素处。
类似地,为了设置相机的Y位置,我们可以将其设置在稍高于_Car_的位置,以便玩家可以更好地看到靠近的汽车。将其设置为350像素。
我们需要创建一个事件,使游戏处于屏幕中心。因此,设置X和Y坐标将是我们的动作。
此动作必须对所有条件为真,即对所有条件为真的情况。为了使动作对所有条件为真,我们不输入条件。
要添加动作,请点击Add action
选项。
要选择动作,您可以从各种下拉菜单中选择,或者可以在顶部的搜索栏中使用搜索功能。
例如,要更改相机的位置,您可以转到图层和相机
,然后选择相机中心X位置
。窗口的右侧现在将显示可配置参数。
因为我们想要将X位置设置为 - 既不少也不多 - 267.5,所以在Modification's sign
中选择**(设置为dquo**选项。在Value
字段中,您可以输入相机的所需X坐标。
或者,您可以在顶部的搜索
栏中搜索要执行的动作。单击“确定”。
现在,您可以在事件编辑器中看到添加的动作。
要设置相机中心的Y位置,请在同一事件中单击“添加动作”。我们将命名我们的场景变量为'CarLeft'。要为您的场景变量分配一个值,请使用动作“设置场景变量的值”。在“变量”字段中输入您创建的变量的名称。
为了在随机位置创建汽车,我们可以使用表达式“RandomInRange”。RandomInRange(min, max)
用于返回在表达式中指定的最小值和最大值之间的随机整数。
我们将使用表达式 RandomInRange(1, 2)
,这样每当表达式返回1时,我们将在第一条(最左侧)车道创建一个蓝车,每当返回2时,我们将在第二条车道创建一个灰车。因此,将“修改的符号”设置为 s=(设置为),值设置为“RandomInRange(1, 2)”。
在为变量_CarRight_添加类似操作之前,这就是我们事件编辑器应该看起来的样子:
在检查_Car1_值并且在_CarTimer_ 被重置的同时创建对应交通汽车的子事件之前,我们将添加一个动作将我们的计时器的值设置为0。为此,我们将使用启动(或重置)计时器
动作。
请检查_Car1_的值并在_CarTimer_被重置的同时创建相应的交通汽车的子事件:
我们要检查_CarLeft_的值是否等于1,以此来创建交通汽车。如果条件为真,我们将为_Blue_创建一个动作。
对于_Gray_,您可以添加类似的子事件检查_Car1_的值是否为2。如果条件为真,我们将创建一个 Gray。
现在,我们将检查_CarRight_的值并根据值创建_Green_或_Pink_。
在完成添加交通汽车后,我们将添加周围树木以模拟移动背景。我们将使用对象_Tree_用于这个目的。
要创建对象_Tree_,我们将使用另一个计时器_TreeTimer_,类似于我们使用交通计时器_TrafficTimer_。我们将在道路两侧向后移动这些树木。
我们需要设置_Tree_的Y坐标,使它们在屏幕之上创建,为了更好的视觉体验,您可以在不同的Y位置创建它们。
我们需要添加一个动作,当_TreeTimer_大于1秒时,将_TreeTimer_重置为0。
在游戏中,我们需要移动树木,以便它们永远不会停止。所以,我们添加一个事件,并在该事件中添加动作而没有任何条件。
我们的树应该沿着与汽车相反的方向移动,这样我们就可以模拟移动背景。添加一个向下的力到对象_Tree_。车辆的运动应该只在垂直方向上。应用于它的力应该没有水平分量。因此,X轴上的速度设置为0,Y轴上的速度将设置为每秒300像素。
移动交通汽车
要移动交通汽车,可以添加没有条件的事件并添加一个垂直力。但是,如果尝试以与“树”类似的方式进行,将不得不为每辆车单独添加这些事件。为了简化这一过程,可以使用GDevelop提供的“对象组”功能。
对象组是对象的集合。可以将相似类型的对象分类到一个对象组中。然后,可以在对象组对象上使用条件和动作,而不是为每个对象单独重复。
在高速公路的左侧移动的“蓝色”和“灰色”应该具有相同的运动方式对于每个创建的对象。同样,“绿色”和“粉色”也应该具有相同的运动方式。因此,我们可以将4辆交通汽车分为2个对象组。
要打开“对象组编辑器”,请单击工具栏中的“打开对象组编辑器”图标。
这将打开对象组列表。场景中的所有对象组将显示在列表中。要向列表中添加新的对象组,请单击“单击以添加新组”旁边的“+”符号。这将向列表中添加一个新组。
要重命名组名,请单击三点菜单或右键单击对象组名称,然后选择“重命名”。我们将将组命名为“TrafficLeft”。现在添加另一个组并将其重命名为“TrafficRight”。
要将对象添加到“TrafficLeft”,请单击组名称。将出现一个新对话框。
单击“选择要添加到组的对象”字段,选择对象“Blue”,然后选择“Gray”,然后单击“应用”。此对象组代表了高速公路左侧的汽车。
类似地,将“Green”和“Pink”添加到组“TrafficRight”中。
要移动汽车,现在我们将添加一个没有条件的事件。我们现在将对“TrafficLeft”和“TrafficRight”应用一个向下的作用力。
“TrafficLeft”中的对象是与“Car”运动方向相同的汽车。因此,这些汽车应该以比“Tree”慢的速度移动,这样看起来汽车比背景快但比“Car”慢。我们将为“TrafficLeft”在Y方向上施加100像素/秒的力。X分量应为0。
另一方面,“TrafficRight”中的对象移动与“Car”的方向相反。因此,这些汽车应该比“Tree”移动得更快,以便它们看起来向后移动。我们将在“TrafficRight”中沿Y方向施加每秒500像素的力。
在开始预览项目时,您可能尚未看到交通汽车。您可以通过为同一事件中的对象设置Z顺序来解决此问题。要一次使用所有对象的动作,请创建一个新的对象组“Traffic”。将所有对象添加到该组中。
注意
要查看交通汽车,应将Z顺序设置为高于覆盖它的对象,即“Highway”。
将“Traffic”的Z顺序设置为高于“Highway”的Z顺序。
您现在可以检查我们迄今为止创建的事件,然后保存您的游戏。
在继续处理“Car”与“Traffic”之间碰撞的事件之前,我们注意到汽车的运动不仅限于道路。
限制汽车在黄线间的运动
要限制汽车在黄线间的运动,我们需要添加一个新事件来检查“Car”的X位置。
我们将为每一侧添加两个不同的事件,因为应用的力应在“Car”位于左侧时为正,在右侧时为负。
黄线距离两端的距离为60像素,而“Car”的宽度为80像素,因此其运动必须在60像素和(535-60-80)之间限制,即395像素。
施加于汽车的力应大于或等于其行为中设置的最大速度(在我们的情况下为200)。
我们的第一个事件将包括一个条件,检查“Car”的X位置是否小于60像素。
如果条件成立,则应在相反方向施加大于或等于汽车最大速度的力。因此,应在X轴上对“Car”施加大于或等于200像素/秒的力。
类似地,我们需要添加另一个事件,其中条件检查“Car”的X位置是否大于395像素。
如果条件成立,应在负X方向上施加高于200像素/秒的力。
如果您预览游戏,现在应该可以看到“Tree”和“Traffic”组中的所有对象,汽车的运动应该在黄线之间受限。接下来,我们需要设置游戏在"Car"和"Traffic"之间发生碰撞时的行为。
碰撞Car和Traffic
在下一个创建的事件中,我们需要设置条件以检查"Car"和"Traffic"之间的碰撞。
为此,您可以使用"碰撞"条件,并将对象设置为"Car"和"Traffic"。
如果此条件为真,我们需要创建一个对象"Explosion"。您可以使用动作"创建对象",并在"要创建的对象"字段中填写"Explosion"。
我们需要将此对象创建在与"Car"相同的坐标上。为实现此目的,您可以在X位置和Y位置分别使用"Car.X()"和"Car.Y()"。
注意
"Car.X()"和"Car.Y()"分别表示"Car"的X和Y位置。
如果您观看预览,会遇到一些小问题:
- 看不到"Explosion"。
- "Car"继续移动。
- "Traffic"继续移动。
我们现在将解决这些问题。请确保将这些动作添加到相同的"碰撞"条件中。
要使"Explosion"可见,请添加一个事件来设置对象"Explosion"的Z顺序,使其高于"Highway"的Z顺序。
要删除"Car"实例,我们将添加一个事件来删除对象"Car"。
类似于我们对"Car"所做的操作,要删除"Traffic"实例,我们也可以删除对象"Traffic"。
您现在可以观看预览。我们的游戏几乎完成了。只有当我们能看到个人得分时,我们才能说游戏完成了。
设置背景颜色
灰色背景并不真正适合游戏。由于道路两侧将有树木,绿色可能是最好的选择。为此,您可以右键单击场景的任意位置,然后选择"场景属性"。单击"场景背景颜色"下面的框,即"单击以选择"。
您可以选择您喜欢的颜色,然后单击"场景属性"中的"OK"。
在场景中显示得分
要显示得分,我们将创建一个事件,这样当_ Traffic _组中的任何对象通过预定义位置时,分数的值将更新。为此,我们需要使用场景变量的帮助。
让我们开始创建一个对象_Score_。
为此,您需要转到场景编辑器,创建一个新对象,并从"添加新对象"表中选择"Text"。
您可以将对象重命名为_Score_,并从"属性"面板选择文本属性。
您现在可以将_Score_对象拖放到屏幕上。您还可以从"属性"面板更改对象的坐标。
我们的游戏中的得分将显示为数字。您不能直接将数字添加到存储在"Text"中的数字。
但是您可以使用变量来实现。要更新分数,我们每次树越过预定义位置时都需要将数字添加到定义的变量中,然后将该值发送到文本对象。
为了重复对_Traffic_中的每个对象执行此操作,我们将创建一个"对每个对象"事件。要创建"对每个对象"条件,请单击顶部的"选择和添加事件"图标。
从出现的菜单中选择"对每个对象"选项。
我们需要为每个_Traffic_重复此事件,因此选择_Traffic_作为要重复的对象。
因为我们希望在_Traffic_每次穿过位置时更新我们的变量,所以我们必须添加一个条件来检查_Traffic_的位置是否大于或等于700。
我们的操作将是创建和更改场景变量的值。类似于我们创建变量_CarLeft_和_CarRight_的方式,创建一个新的场景变量_Points_。
现在,我们将添加一个动作"场景变量的值"。在"变量"字段中输入您创建的变量。
每当_Traffic_通过Y位置为700时,我们将向得分添加100。因此,我们将"修改符号"设置为**"+(添加)**",值"设置为100。
要将此值发送到_Score_,我们将创建一个没有条件的事件,因为我们的分数应始终表示变量的值。
我们将使用动作"修改文本"。在"对象"字段中输入_Score_,并将"修改符号"设置为**
(设置为)**。
我们的文本应显示"得分:"后跟变量的值。但是,问题在于"文本"只能显示一个字符串/文本,而不能显示数字。
为了解决这个问题,我们将首先将变量转换为字符串,然后将其发送到文本。
为此,我们将在"文本"字段中写入""得分:" + ToString(Variable(Points))"。请注意文本中的引号和**+**符号。引号帮助我们区分字符串和函数,而+用于连接两个字符串。即使上述段落中将"Text"的第二部分称为函数,也要记住函数的最终结果将是一个字符串。
如果现在预览游戏,我们会发现"得分"会随着每帧更新。这是因为条件检查"Traffic"的Y位置是否大于或等于700。
为了解决这个问题并优化游戏,我们将在事件中添加另一个动作,即删除对象"Traffic"。
这个动作将释放一定量的内存,同时通过在下一帧中删除"Traffic"来帮助我们解决"得分"问题。
现在,如果预览游戏,您会发现即使发生"Car"和"Traffic"之间的碰撞,得分仍在更新。为此,我们可以在删除树对象的事件中添加另一个条件,即检查对象"Car"是否可见。
警告
对象的可见性与其存在性有所不同。一个对象可能不可见但可能存在,但如果对象停止存在(就像我们的"Car"一样),这直接意味着它不可见。
为了长期优化我们的游戏,我们还可以使用类似的"对于每个对象"事件来删除"Tree"
事件的条件将是检查"Tree"的Y位置是否大于700,而动作则是删除对象"Tree"。
我们的事件编辑器应该是这样的:
您已经创建了一个无限的汽车游戏,得分会随着我们经过树木而更新。
享受游戏。
添加新功能
您现在可以面对自己提出新挑战,比如让汽车离开高速公路,或者允许汽车在前后移动。
GDevelop为用户提供了许多教程,让用户更加熟悉它。您可以在这里查看它们。