HOME / 第 3 部分 · 2D 游戏开发实战 / 第 28 课
MODULE 3 · 2D 游戏开发实战

第 28 课 · 游戏结束与重新开始

⏱ 预计时长 30 分钟📊 难度 入门📚 模块 第 3 部分 · 2D 游戏开发实战

🎯 本课学习目标

死了就该有「游戏结束」提示,还得能「重来」。本课完成游戏闭环的最后一块。

📖 详细教学步骤

添加游戏结束界面搭建

  1. 在 HUD 场景加一个 Panel 居中,命名 GameOverPanel,默认 隐藏(Visible 取消勾选)
  2. 里面放一个 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()

用按钮编辑器连接操作

  1. 选中「重新开始」Button
  2. 检查器 → 节点标签 → 双击 pressed 信号
  3. 选择 HUD 节点,连接,自动生成 _on_restart_pressed()
  4. 把第 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() 重载场景。