HOME / 第 3 部分 · 2D 游戏开发实战 / 第 28 课
MODULE 3 · 2D 游戏开发实战
第 28 课 · 游戏结束与重新开始
🎯 本课学习目标
- 实现游戏结束界面
- 实现重新开始(重置场景)
- 学会 get_tree().reload_current_scene()
死了就该有「游戏结束」提示,还得能「重来」。本课完成游戏闭环的最后一块。
📖 详细教学步骤
添加游戏结束界面搭建
- 在 HUD 场景加一个
Panel居中,命名 GameOverPanel,默认 隐藏(Visible 取消勾选) - 里面放一个 Label 写「游戏结束」、一个 Button 写「重新开始」
让 HUD 提供显示结束的方法代码
在 hud.gd 添加:
GDSCRIPTextends CanvasLayer
@onready var game_over_panel = $GameOverPanel
func show_game_over():
game_over_panel.visible = true
func hide_game_over():
game_over_panel.visible = false
玩家死亡时调用代码
Game 根节点监听玩家死亡:
GDSCRIPTextends Node2D
@onready var hud = $HUD
@onready var player = $Player
func _ready():
player.died.connect(_on_player_died)
func _on_player_died():
hud.show_game_over()
get_tree().paused = true # 暂停游戏
重新开始按钮代码
在 HUD 的按钮脚本(或 HUD 脚本)连接 pressed:
GDSCRIPTfunc _on_restart_pressed():
# 取消暂停并重载当前场景
get_tree().paused = false
get_tree().reload_current_scene()
用按钮编辑器连接操作
- 选中「重新开始」Button
- 检查器 → 节点标签 → 双击
pressed信号 - 选择 HUD 节点,连接,自动生成 _on_restart_pressed()
- 把第 4 步代码填进函数
🎉 现在死亡会弹结束界面,点按钮能重开。
进阶:延时重开 & 返回主菜单进阶
有时想延迟几秒自动重开,或用按钮回主菜单:
GDSCRIPTfunc _on_restart_pressed():
get_tree().paused = false
# 延迟 0.3 秒重载,避免按钮点击被吞
await get_tree().create_timer(0.3).timeout
get_tree().reload_current_scene()
func go_main_menu():
get_tree().paused = false
get_tree().change_scene_to_file("res://main.tscn")
⚠️
重开后游戏还是暂停的?
重载前一定要 get_tree().paused = false,否则新场景仍处于暂停。
⚠️
按钮点击没反应?
游戏结束是 paused 状态,按钮需 Process Mode = Always 才能点击(第 25 课)。
🧪 动手试一试
🏋️ 课后练习
完整闭环:玩家 HP 归零 → 弹「游戏结束」面板 → 点「重新开始」→ 场景重置重新玩。
died 信号 → show_game_over + paused → 按钮 pressed → reload_current_scene。
💡
reload_current_scene() 是重开最简方式;复杂游戏会做专门的场景。
💡
返回主菜单用 change_scene_to_file,第 63 课详讲。
🎓 本课小结
游戏结束 = died 信号 → 显示结束面板 + 暂停;重新开始 = 取消暂停 + reload_current_scene() 重载场景。