一个初学者的无尽跑酷游戏教程
这个教程将帮助您了解GDevelop的工作方式。在本教程中,我们将创建一个非常基本的无尽跑酷游戏,其中平台被随机生成,玩家必须移动以避免被推出屏幕。还有一个得分系统,在玩家活动时更新得分。
若要了解软件的基础知识,您可以参考 这里 获取更多信息。
下载GDevelop
如果您尚未安装GDevelop,请从官方网站下载:GDevelop App
建议始终查看上述页面以获取GDevelop的最新版本,并始终保持软件更新。安装并启动程序后,您将会看到一个“开始”屏幕。
主要游戏元素
☆玩家角色
这是我们,用户,将要控制的主角。玩家角色只能“跳跃”以避开障碍物并保持在屏幕内。它具有静止,奔跑和跳跃动画。
☆平台/障碍物
这些是移动的块,玩家角色必须避开。玩家会随机遇到这些块。
☆得分显示
这个文本块会在玩家活动时更新并显示得分。
下载资源
你需要游戏资源,可以用来创建游戏角色、平台和背景。在这个游戏中找到你需要的所有资源这里。
步骤1: 创建新项目
在开始屏幕上,点击“创建新项目”按钮。这样做后,会出现一个“创建新游戏”对话框。接下来,向下滚动并找到“空白游戏”选项卡。点击它以打开一个新项目。
你也可以选择自定义项目位置。
点击“选择文件夹”选项选择您喜欢的位置。游戏项目文件将存储在此位置。
步骤2: 创建新场景
游戏依赖场景来展示不同的游戏场景。我们可以创建和使用多个场景,但对于本教程,我们只需要 1 个场景。让我们创建一个新场景。
单击“单击以添加场景”区域以创建您的第一个空场景。
您可以通过单击创建场景旁边的三个点并单击“重命名”来自定义场景名称。
确保您已经提前下载了之前提到的压缩包。您将需要它来制作游戏角色。
步骤3: 在新场景上工作
单击上一步骤中创建的场景以打开场景编辑器。这是我们将制作游戏元素的地方。
您应该看到对象选项卡和属性选项卡。 如果您偶然看不到这些选项卡,请点击左侧的图标打开“对象”选项卡。类似地,点击右侧的图标打开“属性”选项卡。
最新版本的GDevelop将在您尝试加载不在游戏项目位置中的资源时发出警告。请确保始终将图像放在与游戏相同的文件夹中(或子文件夹中)。否则,如果移动游戏,它将破坏与图像的链接。在游戏文件夹中解压提供的压缩文件,并使用这些图像。
步骤4: 创建玩家角色
如主要游戏元素中所述,我们需要一个用户可以控制的角色。请注意,由于这是一款无尽跑酷游戏,我们只希望角色跳跃来避开障碍物以保持生存。
单击对象选项卡上的“单击添加对象”区域以创建您的第一个对象。一个对话框将打开,显示各种类型的对象。对于我们的角色,我们需要一个Sprite(精灵)类型的对象,可以为角色添加静止、跳跃或奔跑动画。
单击“Sprite”选项后,会弹出更改精灵对象属性的对话框。现在我们将为角色添加动画。要添加您的第一个动画,只需单击“单击添加动画”区域或点击**+**按钮。
会出现一个新的空动画占位符。我们现在将载入我们的精灵图像来创建动画。如您所见,我们的动画有一个标识符0
,我们也可以为我们的动画提供一个名称。
对于第一个动画,我们希望创建一个静止动画。单击大的**+**按钮将打开一个对话框以加载资源。请注意,我们也可以添加多个图像,但对于此动画,我们只需要一个。
选择您从已下载并解压缩的压缩包中选取的p1_stand.png
图像。选择文件后,动画占位符现在看起来像这样。
注意,我已经给我们的精灵对象命名为“Player”。同样,我也为我们的动画赋予了一个名字“Idle”。命名是可选的,但在项目中为精灵命名使得它们更有组织且易于使用。
我们的第一个动画已经完成。现在,让我们添加跳跃和奔跑动画。尝试使用您下载的存档中提供的图片来完成。奔跑动画将有多个帧,而跳跃动画将只有一个帧根据提供的存档文件。在完成这三个动画之后,它看起来会有点像这样。
如您所见,奔跑动画有多个帧。 每个帧都有单独的图像文件。当执行时,所有帧都会连续播放,从而创建奔跑动画。奔跑动画将看起来像左侧图像所示的动作。
现在我们要为我们的玩家精灵添加一个行为。行为为对象添加额外功能。在玩家精灵对话框中点击“行为”选项卡。然后通过点击“单击以为对象添加行为”区域来创建一个行为,然后选择平台角色类型的行为。
行为编辑器菜单将打开。在这里,请确保取消选中此行为的默认控件功能。默认控件属性会为平台角色添加所有必要的移动,包括向左、向右移动和跳跃。由于我们不希望角色向左或向右移动,而只需要跳跃动作,因此我们禁用此属性并使用事件创建跳跃移动。
我们现在已经完成了创建玩家精灵。请记住为使用多个帧的动画启用循环功能,即在我们的情况下是奔跑动画。如果不循环播放,动画将只播放一次并停在最后一个帧。
第 5 步:创建一个平台
一个平台是角色可以碰撞或行走的对象。对于我们的游戏,平台将是玩家精灵必须避开的障碍。要创建平台对象,请单击对象选项卡上的添加新对象,并选择平铺精灵类型的对象。它是一个像马赛克一样重复的图像。
选择平铺精灵对象后,我们会得到一个类似于我们创建的玩家精灵的对话框。单击“选择图像”区域以选择我们的平台/障碍的图像。一旦加载了资产Platform.png
,对话框将会看起来像这样。
请注意,我还将默认对象名称更改为“Platform”。将默认宽度改为_193_和默认高度改为_40_,目前为止。现在,我们需要为这个对象添加一个行为,类似于我们为玩家精灵添加行为时的方式。转到 行为 选项卡,单击以为对象添加行为,然后选择平台类型的行为。
完成后点击 应用。现在是时候将我们创建的对象放置到场景空间中了。
第 6 步:将对象添加到场景
从对象选项卡中拖动和放置平台和玩家精灵,并将它们放置在您的场景中。
这是我放置了两个对象后场景空间的样子。请注意,您可以看到的黑色边框是游戏窗口的大小。这个空间中的元素只对用户可见。我们可以通过转到项目管理器 o属性来更改窗口大小,但目前就保持原样。
在场景空间中右键单击障碍物对象,然后选择复制或 Ctrl+ C(对于Windows)来复制对象。我们将创建多个障碍物以填充场景空间。复制后,请右键单击粘贴以在场景空间中复制对象。多次重复此操作以填充场景。场景现在看起来像这样。
我们需要在场景空间右侧创建更多的障碍物/平台,以便更平滑地生成障碍物。最后,为我们的游戏添加一个天空盒或背景。它是一个精灵类型的对象。请尝试自行添加此对象。这里使用的资源是background.png
。场景现在看起来像这样。请注意创建的额外障碍物。要将背景图像放到所有其他资产的后面,我们希望它的Z-Order最小。可以在左侧的属性选项卡中更改 Z-Order。
现在是最有趣的部分。是时候让我们的游戏实现功能了。在进入下一步之前,了解一下事件。
第 7 步:创建事件/使游戏具有功能
事件是我们用来创建GDevelop中游戏规则的。这是使GDevelop与传统游戏引擎相比特别的地方。在GDevelop中,事件让您可视化地编程您的游戏,无需任何编程知识或经验,因此任何背景的人都能创建实际的游戏玩法,并允许玩家与游戏互动。
That being said, let's make our first event. Move on to NewScene(Events) tab by clicking on the mentioned tab. Then click on the icon shown on the left to create an empty Event.
For our first event, we want our Player Sprite to Jump when the Up arrow key is pressed. To do that, we need to add a condition to detect whether the Up key is pressed or not. Click on Add a condition and search for the "Keyboard" category. Choose Key pressed condition and make it check the Up key as shown below.
Click on OK to confirm and we will have our first Event condition. Next up, we need to "Add an action" that will take place if the condition is met. We want our character to jump when the specified condition is met. To add this action, search and click on Platform Behaviour->Control->Simulate jump keypress.
Note that the Object should be set to Player as we want the player to perform the action. Now we also want the jump animation to play while the Player Sprite jumps. To do this we add another action for the same event condition. Click on Add an action->Sprite->Animation and images->Change the animation and set it as shown. Note that instead of using identifier numbers, you can also use the animation name. To refer to animations using their name, you should use the Change the animation (by name) option instead. The name should be within quotes.
The Events tab will look something like this now.
Adding Comments is a good way to keep the event editor organized. To add a comment, click on the icon shown on the left. Comments are used to describe what is being checked and performed in that particular event for debugging later.tip
It's now time to see how the created event works. Click on the Play
button to Preview the Project. A preview window opens up, where we can test the various functions in our game. The preview window shows us exactly how the game looks and performs while in action.
Right now, we want to test the event that we just created, i.e, making our character Jump and also playing the jump animation while jumping. Use the Up arrow key to test the jumping action.
We can see our character jumping and also the animation has now changed to the Jump animation specified. Note that the character stays in the Jump animation state even after coming back to the ground. We will handle this problem when we create other events.
Making the Obstacles Move
For the second event, we will now make the obstacles/platforms move towards the left of the screen. To do this, we need to specify a force due to which the obstacles move at a certain speed. First of all, click to add a new event just like you did for our first event. No need to specify any condition for now. Let's focus on the actions.
For our first action, click to "Add an action". Then find Common actions for all objects->Movement->Add a Force(Angle). Then choose Platform as the object and assign it an angle 180(specifying left direction) and a speed 250. You can test the action we just created by using the Play button to see a preview. You can see the obstacles moving towards the left. Notice that when the Player Sprite comes in contact with the Platform/Obstacle, it also moves(slides) towards the left. We don't want our character to move when he is on the floor of the platform. Our next event handles that.
As mentioned above, we need to fix the Player Sprite sliding issue. To do that, we will make use of a new event. Click to add a new event, and "Add a condition", Platform Behavior->Options->Is on floor. Choose the object to be Player because this is what we are trying to check, i.e, whether the character "is on floor".
Now, we need to add a corresponding action. Add an action to this event, similar to the one we added for the obstacle/platform to make it move towards left. This time, we need to make our character move towards right whenever he is on the floor of the platform. We say "move towards the right" but our character doesn't really move. It just balances the negative movement of the platform or obstacle so that the character does not slide. Try to add this action yourself.
Hint: Click on Add an action. Find Common actions for all objects->Movement->Add a Force(Angle). Then choose Player as the object and assign it an angle 0(specifying right direction) and a speed 250.tip
Now you can try the preview of the events we made. You can see that now the sliding problem has been fixed and the basic game mechanics have been successfully created, that is, the character can jump to avoid the obstacles and the obstacles move constantly towards the character. Note that at this point, the obstacles are limited and the character soon runs out of platforms to jump on. We are going to work on this problem in our next event.
我们还需要在角色在地板上时播放Run动画。由于我们已经创建了一个检查“是否在地板上”的事件条件,我们可以简单地为这个相同的事件添加另一个操作。单击添加操作->精灵->动画和图像->更改动画。然后填写对象和要播放的动画标识符,以播放特定的动画。对于这个游戏,我们将我们的Run动画保存在标识符2
处。您也可以使用动画名称作为标识符。要使用名称来引用动画,请使用按名称更改动画选项。如果使用名称,请不要忘记将名称放在引号(“”)中,因为它是一个字符串。
使游戏无限进行
创建一个新事件。在这个事件中,我们将使平台无限。在继续之前,回到场景空间并分析平台/障碍物的最后瓦片的X位置。
如您所见,对我来说,最后一个瓦片的X位置是_1550_。如果您的情况不同,请不用担心。无论值是多少,我们将使用该值使平台无限循环。现在,为这个新事件添加条件
。找到所有对象的常见条件->位置->比较对象的X位置。选择对象“Platform”,具有修改符号**≤(小于或等于)和值为-200**。
我们在这里检查和比较平台的第一个瓦片的X位置。条件是如果平台的X位置≤-200,则将执行相应的操作。现在您可能会想为什么值是**-200**?好吧,我们的场景空间X位置从值_0_开始。我们需要检测当我们的平台的最左侧瓦片退出场景空间时。我们选择-200作为一个任意的X位置,它在场景空间之外。
一旦条件就绪,我们将会添加一个操作。找到所有对象的常见条件->位置->更改对象的X位置。现在,我们使用我让您记住的最后一个瓦片的X位置的值。对我来说,它是_1550_。现在,选择“Platform”作为对象,修改符号为** (等于),值为1550**。点击确定以确认,然后我们的事件就完成了。
我们在这个事件中设置了我们的障碍物/平台瓦片的循环。一旦一个瓦片超出界限,也就是离开了场景空间,它就会被传送到一个X位置(在我这里是_1550_)向右移动。因此,障碍物瓦片不断循环,游戏无限进行。
游戏状态
我们现在将为游戏添加状态。状态描述了我们游戏的状态。它可以被视为一个标志,用来检测角色是否在行动中或角色是否从平台上掉下来。这是决定“游戏结束”状态并因此重新开始游戏所必需的。我们可以通过简单地创建一个场景变量来记录状态。我们的游戏将有3种状态。
第一个状态或初始状态是游戏还没有开始,并且需要用户开始游戏。我们将使用值0来引用这个状态。
第二个状态是当角色或玩家精灵在行动中时。我们将使用值1来引用这个状态。
第三个状态是“游戏结束”状态,当角色从平台上掉下来时。我们将使用值2来引用这个状态。
首先,我们需要设置一个变量来存储游戏的当前状态。创建一个新事件。添加条件->场景->在场景开始时。
接下来,添加操作->变量->设置场景变量的值。然后给你的变量命名,比如 state,并将其设置为0。这在场景开始时将游戏设置为初始的预游戏状态。
我们不希望游戏立即开始。我们希望在用户按下键后开始游戏。
换句话说,我们希望在场景变量state的值为1时游戏开始。让我们修改我们的事件。
提示: 在我们为平台设置移动力的事件中,我们现在将添加一个条件。点击添加条件->变量->设置场景变量的值。设置它来检查值是否等于1。
看看我在我们的事件中做的更改:我添加了一个新条件并制作了一些子事件。子事件的条件仅在父事件的条件结果为true
时进行检查。在我们的情况下,如果游戏处于初始状态(事件),那么子事件才会检查各自的条件并执行相应的动作。
要将事件转换为子事件,您需要将该事件拖动到与其相关联的父事件下面。您将注意到事件-子事件梯形中的缩进,这证实了缩进的事件是相对于父事件的“子事件”。
子事件仅在父事件的条件结果为 false
时有效。如果父事件的条件结果为false
,子事件的条件将不会检查,因此,即使子事件的条件结果为true
,它们对应的操作也不会执行。
要全部添加一个新的子事件,请单击选择我们正在创建子事件的事件。然后单击左侧显示的图标。您可以在GDevelop的导航菜单中找到它。现在,除非场景变量的值为1,游戏不会开始,也就是平台不会移动,玩家也无法跳跃。
我们需要用户按下键盘上的键来开始游戏。为此,添加一个新事件。我们需要两个条件。一个用于检查场景变量的值,另一个用于检测按键是否被按下。这两个条件在其他事件中以某种形式已经添加过。尝试自己做一下 😃
提示:对于第一个条件,我们需要检查场景变量状态的值。点击添加条件→变量→检查场景变量的值。设置为检查其值是否等于0。对于第二个条件,添加条件→键盘→按键按下,然后设置为检查上键。提示
现在,我们添加一个动作来改变游戏状态。我们想要将场景变量的值更改为1。点击添加动作→变量→设置场景变量的值。然后命名你的变量,例如state,并设置为1。看起来是这样的。
现在,您可以测试游戏的运行方式。您会注意到,游戏不会在点击播放按钮后立即开始。您需要按下上键来开始游戏。如果您不理解发生了什么,请再次查看上面所做的事情 😛
现在,我们需要处理第三种状态,即当游戏由于角色掉落出平台而结束时。我们需要检查角色的X和Y位置,也就是说,我们需要检查角色是否在场景空间内。如果他到达场景外部,很明显他已经从平台上掉下来或被推到屏幕外。我们检查这些条件,并将游戏状态更改为游戏结束状态。
在此事件中,我们使用条件和子条件的概念。在深入了解逻辑之前,让我们首先设置这个条件-子条件梯子。添加条件→高级→或。这是我们使用的主条件。确认并创建此条件后,您将注意到现在可以添加子条件。尝试自己通过查看上面的图像来做到这一点。
提示:找到所有对象通用条件→位置→比较对象的X位置。选择对象“Player”,修改标记为**≤(小于或等于),值设置为-69**。类似地,对于下一个子条件,找到所有对象通用条件→位置→比较对象的Y位置。选择对象“Player”,修改标记为**≥(大于或等于),值设置为-550**。提示
现在,让我们理解我们在这里做了什么。我们添加的条件规定了这样一个规则,即如果子条件中的任何一个为真,则将执行与此事件关联的动作。由于如果角色掉下(Y位置)或被推到屏幕外(X位置)游戏结束,因此我们检查X位置和Y位置。
现在,当发生这种情况时,我们希望更改游戏的状态,因此我们添加一个动作将场景变量的值更改为2,即所需的第三种状态。
您现在可以测试游戏。您会注意到,如果您掉下去或被推出,障碍物的移动会停止。这表明游戏已成功达到游戏结束状态。在下一个事件中,我们将重新开始游戏,当用户按下一个键时。
重新开始游戏
我们希望在用户达到游戏结束状态后按下按钮后重新开始游戏。为此,让我们创建一个新事件。我们要检查游戏状态是否为2。如果是,则我们希望用户按下Enter/Return键重新开始游戏。为此,我们添加两个条件,一个用于检查状态变量的值,另一个用于检查是否按下了Enter键。尝试自己添加条件或查看提示,如果遇到困难。
提示:对于第一个条件,我们需要检查场景变量状态的值。点击添加条件→变量→检查场景变量的值。设置为检查其值是否等于2。对于第二个条件,添加条件→键盘→按键按下,然后设置为检查Return键是否按下。提示
接下来,我们需要添加一个动作来重新启动游戏或场景。要做到这一点,添加一个动作→场景→更改场景。然后指定我们场景的名称(需用引号括起)。选择停止任何其他暂停的场景选项。本游戏只包含一个场景,因此这个选项并非必要,但对于包含大量场景的游戏可能有助于提高性能。
现在,在达到游戏结束状态后,当用户按下Enter/Return键时,游戏将重新启动,并返回到初始状态,即用户必须按上键开始游戏的状态。
您现在可以测试游戏,并注意状态的变化。现在唯一剩下的是添加一个得分系统和一些文字说明,以帮助用户了解游戏状态。
添加得分系统
得分系统是每款游戏中必不可少的元素。将其添加到我们的游戏中很容易,因为我们不需要添加任何新的事件。我们将编辑一些已经创建的事件以适应这个系统。我们希望得分在每次游戏开始时从0开始。得分将持续更新,直到达到游戏结束状态。首先,让我们创建一个对象变量来存储这个得分值。> 您还可以使用其他类型的变量,如场景变量和全局变量,而不是我们在此处使用的对象变量。这些变量之间的区别在于它们对游戏有不同的_scope_。您可以在这里了解更多关于变量的信息。
转到场景编辑器面板中的对象选项卡。选择您喜欢的任何对象。我们这里选择平台。单击平台对象选项卡旁边的三个点,选择编辑对象变量。会弹出一个新的对话框,您可以在其中添加和配置对象变量。单击大的加号按钮添加一个新变量。然后按照以下步骤自定义变量名称和值。
现在,我们将其默认值设置为0。现在我们需要制作一个用于更新分数的动作。找到下面显示的我们之前已经创建的事件。
我们将在这里添加这个动作。点击添加动作。找到通用动作 ->所有对象的变量 ->修改对象的变量。然后按照以下步骤操作。
我们想修改我们刚创建的对象变量。通过添加此动作,我们告诉游戏在角色执行动作时连续更新值。
我们需要一个文本对象来显示值的变化。转到场景编辑器。添加一个新的类型为文本的对象。
按照上述所示进行必要的修改。您可以根据自己的喜好进行自定义。编辑完文本后,单击应用。然后将文本对象拖放到场景空间。将会是这样的效果。
让我们回到我们正在编辑的事件。我们需要添加另一个动作来更新此文本。
一旦回到那个特定的事件,点击添加动作 ->文本对象 ->修改文本。现在,仔细查看下面显示的图像。现在,文本对象具有字符串类型的值,但是我们的分数变量存储数字值。我们需要在这里使用一个库函数将整数转换为字符串,然后更新文本对象的文本。
我们使用函数 VariableString(变量)
来完成我们的工作。您可以在它们各自的教程中了解更多有关库函数的信息。现在,您可以测试游戏。您会看到分数在玩家活动时不断更新。一旦达到游戏结束状态,分数就不再更新。
我们修改的事件现在看起来像这样。
现在,我们将添加其他必要的文本对象,如游戏结束文本,分数文本,按Enter重新启动和按Up键开始。对于每个文本,我们将创建单独的文本对象。类似于我们之前的步骤,添加新的文本对象并在对象编辑器中修改文本。将它们简单拖放到场景空间以显示它们。
注意我为不同的文本单独创建了文本对象。但是我们不希望游戏在一开始显示游戏结束
文本。游戏结束文本应仅在游戏结束状态下可见,也就是状态变量的值为2时。类似地,我们希望在此阶段显示按Enter重新启动文本,而其他文本应该隐藏。在阶段0,按Up开始的文本应该可见。当玩家活动时,我们希望隐藏文本。为了进行这种可见性修改,我们使用 所有对象的通用操作 -> 可见性动作。在按照上述步骤在他们各自的位置添加所有操作之后,事件编辑器页面将会看起来像这样。
在场景开始事件的开始处,我们已经添加了两个新动作来隐藏游戏结束和重新启动文本。要添加这些动作,请点击添加动作 -> 所有对象的通用操作 -> 可见性 -> 然后相应地隐藏或显示。
现在,当游戏已经开始时,我们也希望隐藏开始文本。为此,我们在上面创建的事件中添加另一个动作。
最后,我们添加两个事件在游戏结束时显示 游戏结束 和 重新启动 文本,也就是当游戏结束状态达到时。
就是这样!您已经成功学会如何创建一个无尽奔跑游戏。一旦掌握了使用功能的方法,利用GDevelop制作游戏将非常容易。我写这篇详细教程大约用了三天的时间,而制作这个游戏只用了大约一个小时。是的,这就是在GDevelop中制作游戏的简单过程💓
奖金:使游戏更具挑战性
游戏太容易玩了吗?您希望游戏更具挑战性吗?别担心,让我们一起努力。
我们将处理移动平台/障碍物的速度。我们希望随着分数的增加它们移动得更快。
首先,我们希望添加一个新的场景变量来存储平台移动的初始速度。要添加场景变量,请转到具有在场景开始时
条件的事件。就像我们之前做的那样,添加一个新变量。点击添加一个动作→ 变量→ 场景变量的值。然后为您的变量命名,例如速度,并将其设置为250,即初始速度。现在,我们要更改事件:在那里指定平台移动的力量值。而不是指定一个值,我们将使用场景变量 speed。为了在那里使用场景变量,我们需要遵循这种语法:Variable(speed)
,其中speed是指定的场景变量。
对于我们为避免滑动指定速度的动作,也要做同样的事情。现在,我们可以开始更改随着得分增加而改变速度的工作。
现在,我们想要检查对象变量 score
的值,并根据需要更改场景变量 speed
的值。添加新事件并指定增加平台速度的条件。下面是一个示例: