HOME / 第 3 部分 · 2D 游戏开发实战 / 第 25 课
MODULE 3 · 2D 游戏开发实战
第 25 课 · 游戏状态管理
🎯 本课学习目标
- 理解游戏状态(进行中/暂停/结束)
- 用枚举管理状态
- 实现暂停功能
游戏需要知道「现在在干什么」:正在玩、暂停了、结束了。本课用状态机思路管理游戏状态。
📖 详细教学步骤
什么是游戏状态?概念
大多数游戏都有几种状态:
- PLAYING 进行中:玩家可操作
- PAUSED 暂停:一切停止
- GAME_OVER 结束:玩家死亡/过关
用状态变量控制「哪些逻辑生效」,是管理复杂游戏的关键。
用枚举定义状态代码
在根节点脚本定义状态枚举:
GDSCRIPTextends Node2D
enum GameState { PLAYING, PAUSED, GAME_OVER }
var state: GameState = GameState.PLAYING
func _process(delta):
match state:
GameState.PLAYING:
# 进行中的逻辑
pass
GameState.PAUSED:
# 暂停时不做任何更新
pass
GameState.GAME_OVER:
pass
func set_state(new_state: GameState):
state = new_state
print("当前状态:", state)
实现暂停代码
Godot 有内置暂停:get_tree().paused = true。把要「暂停时也动」的节点勾选 Process Mode = Always(检查器 Node → Process):
GDSCRIPTfunc _unhandled_input(event):
# 按 Esc 暂停/继续
if event.is_action_pressed("pause"):
toggle_pause()
func toggle_pause():
if state == GameState.PLAYING:
state = GameState.PAUSED
get_tree().paused = true
elif state == GameState.PAUSED:
state = GameState.PLAYING
get_tree().paused = false
暂停菜单的节点处理实操
- 场景里放一个「暂停面板」(Control + Panel),默认隐藏
- 暂停时显示它:
pause_panel.visible = true - 给它挂脚本,把 Process Mode 设为 Always,这样暂停时按钮仍可点击
- 按钮「继续」→ 调用 toggle_pause()
游戏结束状态代码
玩家死亡时切到结束状态:
GDSCRIPTfunc game_over():
state = GameState.GAME_OVER
get_tree().paused = true
game_over_panel.visible = true
print("游戏结束")
⚠️
暂停后按钮点不了?
暂停会停掉所有默认节点。给 UI/按钮设 Process Mode = Always(或 When Paused)。
⚠️
暂停后物理还动?
get_tree().paused = true 会暂停大多数处理;确实需要继续的节点单独设 Process Mode。
🧪 动手试一试
🏋️ 课后练习
用枚举实现 PLAYING/PAUSED 状态,按 P 键暂停并显示暂停面板,再按 P 恢复。
创建 pause 动作绑定 P;get_tree().paused 切换;面板 Process Mode=Always。
💡
状态机思想(枚举 + match)几乎适用所有游戏,务必掌握。
💡
把暂停逻辑集中在 Game 根节点脚本,方便统一管理。
🎓 本课小结
游戏状态用枚举+match 管理;get_tree().paused 实现暂停;暂停时仍要响应的节点设 Process Mode=Always。