文章

用Godot做一个简单的平台跳跃小游戏

在学习了GDScript基本语法以及节点、信号两个引擎特性后,我跟着一个从Unity转Godot的油管博主的教程实现了一个简单的平台跳跃游戏,此博客记录了我在这个过程中一些比较重要并且容易忘记的一些操作与技巧

用Godot做一个简单的平台跳跃小游戏

一、原作者以及我的代码仓库

二、按键绑定

2.1 自定义输入按键

  • 在Godot引擎顶部Project选项中的Project Settings中可以添加按键映射,同一个动作可以绑定多个按键

GodotInputBinding.png

  • 以跳跃的触发为例,我们看看代码的实现
1
2
3
# 跳跃动作,通过设置中的"jump"动作绑定的按键触发,并要求玩家在地面上
if Input.is_action_just_pressed("jump") and is_on_floor():
	velocity.y = jumpForce

三、场景逻辑

3.1 将某.tscn场景设置为AutoLoad

  • 比如我们在Game场景内放置一个音乐播放器节点用于播放bgm,但是玩家每次死后由于场景重新加载,导致bgm从头开始播放,我们为了避免这样的不连贯性,应当将这个音乐播放器设置为全局的,即添加到AutoLoad
  • 这意味着我们加载了主场景的时候,即使这个音乐播放器节点不属于当前场景树,也会被播放

GodotAutoLoad.png

四、碰撞检测

4.1 节点只与特定类型对象产生碰撞

  • 比如玩家和金币节点对象碰撞会触发金币消失和金币+1,我们不想让别的物体比如移动的平台也触发这个碰撞,那么我们可以通过设置应当碰撞的两个物体的CollisionObject2D/Collision属性下的LayerMask图层即可,如我们将玩家的Layer设置成2

GodotCollisionLayer.png

  • 再将金币的Mask设置成2,这样的话金币本身处于Layer1层,而只接收处于Layer2层的对象的碰撞,处于别的层的则不会触发碰撞,也就不会触发相关的信号

GodotCollisionMask.png

五、相机设置

5.1 相机跟随范围(Limit)

  • 可以从四个方向设置摄像机镜头跟随玩家的极限范围,比如当玩家掉落虚空时相机的视角不应当跟随着掉下去,这就需要设置相机的Bottom Limit,如下图黄色框所示

GodotCameraLimit.png

  • 可以通过红色框所示的尺子工具测量场景中的长度

六、音效播放

6.1 技巧性地利用AnimationPlayer播放音效

我们想为拾取金币添加一个拾取音效,但是拾取后金币会被我们删除掉,导致音效来不及播放,为此我们可能可以通过添加一个计时器之类的解决这个问题,这里提供一个技巧性的解决方案:通过AnimationPlayer来播放音效、调用脚本中的方法,详细实现过程参考此处(Unity也有类似的在动画播放过程中调用Animator上的脚本中的函数方法的实现方法)

  • 其本质上是通过设置一个拾取金币的动画”pickup”(里面包含了Sprite、音乐、碰撞箱的组件,组件有自己的跟随动画一起播放的轨道)
  • 我们让玩家碰到金币时触发这个”pickup”动画,此动画播放过程中:Sprite被设置为不可见、碰撞箱被取消(Disabled被设置为on)、音效播放器被打开(Playing被设置为on
  • 这段动画播放完成后,通过Add Track按钮添加一个Call Method Track轨道,调用金币Coin节点上的脚本中的queue_free()函数来使金币消失

GodotSFXAnimationTrick.png

  • 注意,上述图中的上面三个轨道的那三个key frame太靠后了,会导致金币拾取音效播放的延迟,应当将其再往前拖一点,如下图

GodotAnimationSFXBTW.png

  • 最后,我们在金币Coin节点的脚本中在金币被拾取后调用该动画即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
extends Area2D

# 获取GameManager的引用,以使得拾取金币能增加得分
@onready var game_manager = %GameManager
# 获取动画播放器,用于播放拾取金币的动画
@onready var animation_player = $AnimationPlayer

# 当有对象与coin发生碰撞的时候执行这个信号函数
func _on_body_entered(body):
	# 调用GameManager进行分数的增加
	game_manager.increase_score_by(1)
	# 调用拾取金币的动画,包含播放音效,在一段时间后会自动调用queue_free()函数删除该金币
	animation_player.play("pick_up")
	
	# 删除这个coin对象
	# queue_free()

七、项目打包

  • 勾选Embed PCKOn选项即可以打包成单独一个exe,若想打包成别的平台的包,可以选择Add来选择别的系统
  • 记得在截图中未展示出的地方的Application/Product Name选项处填写导出文件的名字

GodotExport.png

  • 最后点击Export Project即可选择一个目录进行导出,记得取消勾选Export With Debug

GodotUncheckExportWithDebug.png

本文由作者按照 CC BY-NC-SA 4.0 进行授权