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

第 27 课 · 得分系统与 HUD 界面

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

🎯 本课学习目标

游戏得有个分数显示。本课实现得分系统,并让 HUD 界面实时更新。

📖 详细教学步骤

创建 HUD 场景搭建

  1. 新建场景,根节点 CanvasLayer,命名 HUD,保存 hud.tscn
  2. CanvasLayer 让 UI 永远显示在游戏画面之上(不被世界物体遮挡)
  3. 添加子节点 Label,命名 ScoreLabel,放在左上角

UI 场景常用做法概念

UI(用户界面)建议用独立场景 + CanvasLayer:

  • UI 与游戏逻辑分离,互不干扰
  • CanvasLayer 保证 UI 永远在最上层
  • 改 UI 不影响游戏场景

用代码更新分数显示代码

HUD 脚本提供公开方法:

GDSCRIPTextends CanvasLayer

@onready var score_label: Label = $ScoreLabel

var score: int = 0

func add_score(points: int):
    score += points
    update_display()

func update_display():
    score_label.text = "得分: " + str(score)

Game 根节点集成集成

把 HUD 实例放入主场景,游戏逻辑调用它的方法:

GDSCRIPTextends Node2D

@onready var hud = $HUD

func _on_coin_collected(points: int):
    hud.add_score(points)   # 调用 HUD 加分方法

金币被吃到就加分(完整闭环)实战

金币 Area2D 被玩家碰到时:加分 + 播放声音(声音第 44 课)+ 删除:

GDSCRIPT# coin.gd
@onready var hud = get_node("/root/Main/HUD")  # 或第67课用单例

func _on_body_entered(body):
    if body.is_in_group("player"):
        hud.add_score(10)
        queue_free()

HUD 字体与样式美化

  1. 选中 Label → 检查器 Theme Overrides → Font Sizes → Font Size 调大(如 28)
  2. Colors → Font Color 改成白色或亮色
  3. 可用 Outline 加描边让文字清晰

💡 每个控件都能独立覆盖主题样式,后面第 38 课系统讲。

⚠️
UI 跑到游戏画面下面去了?

把 HUD 根节点用 CanvasLayer(而不是 Node2D),它保证 UI 永远在最上层。

⚠️
分数不更新?

确认 add_score 后调用了 update_display(),且 label 引用正确($ScoreLabel 拼写一致)。

🧪 动手试一试

🏋️ 课后练习

做 3 个金币,每个加 10 分,全部吃完显示总分 30,并把分数 Label 的字体调大到 30 并加描边。

HUD 用 CanvasLayer + Label;金币 body_entered 加分。

💡

UI 用独立 HUD 场景管理,项目后期会非常清晰。

💡

CanvasLayer 是 UI 最佳实践的根基,务必理解。

🎓 本课小结

HUD = CanvasLayer + Label 组成的 UI 场景;通过公开方法(add_score)与游戏逻辑解耦;金币吃到 → 加分 → 更新显示。