谢夏戈 @ xiexiage.com

创建主角:小鸟

May 12

创建节点的方法:

创建节点/创建Node,点击加号「+」,然后输入需要的节点名称即可创建 02-create-bird-创建节点的方法

创建主角:小鸟

我们需要用到 3 个节点来组成小鸟:

  • CharacterBody2D — 角色节点(控制移动)
    • Sprite2D — 图片节点(显示外观)
    • CollisionShape2D — 碰撞体节点(检测碰撞)

先用 Godot 自带的图标当小鸟,把它拖到 Sprite2DTexture 上即可:

02-create-bird-创建小鸟

保存场景

Ctrl + S 保存场景,建一个文件夹专门放场景文件:scenes/bird.tscn

02-create-bird-保存场景

设置碰撞体

选中 CollisionShape2D,在右侧面板选一个形状(矩形:RectangleShape2D),缩放到和图片差不多大:

02-create-bird-碰撞体1

这个蓝色矩形就是碰撞体,游戏里小鸟撞到东西靠的就是它:

02-create-bird-碰撞体2

编写脚本

选中 CharacterBody2D 节点,点击右上角的 📜 图标创建脚本:

02-create-bird-创建脚本

同样建一个文件夹专门放脚本:scripts/bird.gd

02-create-bird-脚本

extends CharacterBody2D # 创建时自带的

@export var gravity_scale := 2.0       # 重力倍率(控制掉落快慢)
@export var jump_force := -500.0       # 跳跃力量(负值 = 向上)
@export var max_fall_speed := 1000.0   # 最大掉落速度

func _physics_process(delta: float) -> void:
    # 1. 施加重力:每帧让小鸟往下掉
    if not is_on_floor():
        velocity += get_gravity() * delta * gravity_scale

    # 2. 限速:防止掉太快
    if velocity.y > max_fall_speed:
        velocity.y = max_fall_speed

    # 3. 按键跳跃:按下就给一个向上的速度
    if Input.is_action_just_pressed("fly"):
        velocity.y = jump_force

    move_and_slide()

这段代码在干嘛?

extends CharacterBody2D # 创建时自带的
  • CharacterBody2D 节点创建脚本时会自带的代码。告诉 Godot:这个脚本是给「角色」用的(一般不用理会)。
@export var gravity_scale := 2.0       # 重力倍率(控制掉落快慢)
@export var jump_force := -500.0       # 跳跃力量(负值 = 向上)
@export var max_fall_speed := 1000.0   # 最大掉落速度
  • var 定义变量
  • jump_force 等是自定义的变量名,
  • -500.0 是我们定义的数值!
  • @export 加在前面是为了让 Godot 把变量放到面板上,方便我们后续调整。👇

02-create-bird-右侧面板

它就是我们说的「数值」,例如一般游戏中用来定义角色的「攻击力」「血量」......

func _physics_process(delta: float) -> void:
  • func: 用来定义方法
  • _physics_process(delta):游戏每一帧都会自动执行这个函数(大约每秒 60 次)
func _physics_process(delta: float) -> void:
    # 1. 施加重力:每帧让小鸟往下掉
    if not is_on_floor():
        velocity += get_gravity() * delta * gravity_scale

    # 2. 限速:防止掉太快
    if velocity.y > max_fall_speed:
        velocity.y = max_fall_speed

    # 3. 按键跳跃:按下就给一个向上的速度
    if Input.is_action_just_pressed("fly"):
        velocity.y = jump_force

    move_and_slide()

其中:

# 1. 施加重力:每帧让小鸟往下掉
if not is_on_floor():
    velocity += get_gravity() * delta * gravity_scale
  • if 是用来【判断】的
    • not 是否定句
    • is_on_floor() 是 Godot引擎 为 CharacterBody2D节点赋予的属性
    • if not is_on_floor(): 的意思是“如果 ‘角色’ 没有 站在地面时” 是的,如果角色没有在地面,那就让角色往下掉!但是要以什么速度往下掉呢?
  • velocity += get_gravity() * delta * gravity_scale
    • velocity 是 Godot 给 CharacterBody2D 内置的「速度」属性。它是一个二维数值,有 x(左右速度)和 y(上下速度)两个分量。初始值是 0(小鸟不动)
    • get_gravity() 是 Godot 内置方法,返回项目设置里的「重力」值(默认向下 980)
    • delta 是「上一帧到这一帧的时间间隔」(秒)。乘上它能保证不同帧率(60fps / 120fps)下游戏速度一致
    • gravity_scale 是我们自己定义的「重力倍率」,越大掉得越快
    • += 是「累加」的意思,等价于 velocity = velocity + ...

所以这一行的意思是:每一帧给 velocity 累加一点点重力。速度越累越大 → 小鸟越掉越快,这就是物理课上学过的「自由落体」。

# 2. 限速:防止掉太快
if velocity.y > max_fall_speed:
    velocity.y = max_fall_speed
  • velocity.y 就是上下方向的速度(往下为正、往上为负,这是 Godot 的坐标系约定)
  • 如果当前下落速度 velocity.y 超过了我们设的最大值 max_fall_speed,就把它「卡」在最大值上
  • 为什么需要? 因为重力会一直累加,没有这个限制小鸟会越掉越快,最后快得看不见
# 3. 按键跳跃:按下就给一个向上的速度
if Input.is_action_just_pressed("fly"):
    velocity.y = jump_force
  • Input.is_action_just_pressed("fly") 检测「fly」这个按键刚刚被按下(一次按下只触发一次,长按不会连续触发)
  • 一旦按下,直接把 velocity.y 设为 jump_force(前面定义的 -500.0,负数 = 向上)
  • 这就是「跳跃」:瞬间把速度变成向上,覆盖掉之前累加的下落速度

「fly」是什么按键?我们还没告诉 Godot,下面就来配置快捷键。

move_and_slide()
  • Godot 给 CharacterBody2D 内置的方法
  • 根据 velocity 真正移动小鸟,并自动处理碰撞(撞到东西就停下来)
  • 没有这一行,前面算好的 velocity 都只是「空想」,小鸟不会真的动起来

配置跳跃按键

代码里用了 Input.is_action_just_pressed("fly"),所以我们需要在项目设置里添加这个按键映射:

路径:项目 -> 项目设置 -> 输入映射 (Input Map) 02-create-bird-配置跳跃按键

  1. 在上方输入 fly,点击「添加」
  2. 点击 fly 右边的 +,按下你想要的按键(比如空格键)

这样按空格键小鸟就会往上跳了!不过目前这只小鸟还没有舞台,下一章,我们将为它搭建一个可以飞的场景。

2023-PRESENT © 谢夏戈