更多精灵、GameManager 与重构
Source: Dev.to
更多精灵
我们现在真的取得了进展。在上一篇文章中,我展示了鱼和船。但这还不是全部——我还加入了一朵云和一些水……或者说,波浪。
我把船稍微向下移动了一点,这样看起来它真的坐在水面上,而不是尴尬地悬在空中。
船的上下浮动动画
为了让画面更有活力,我给船添加了一个细微的上下浮动效果。方法是向 Player 场景中添加一个 AnimationPlayer,创建一个新动画,并将 Y 位置从 0 → -2 → 0 进行动画化。然后把它设为循环。
# Get the animation reference
@onready var animation = $AnimationPlayer
func _ready() -> void:
animation.play("bopp") # Note: the animation is intentionally named "bopp"
这是一段很小的移动,但却产生了很大的差别。船不再显得静止;它轻轻漂浮,仿佛真的在水面上而不是粘在屏幕上。
波浪
对于波浪,我在 Main 场景中添加了一个 TileMapLayer 作为子节点。我不确定是否应该把它做成独立的场景再实例化,但以后会再考虑。
我专门为波浪瓦片制作了一张精灵表。以后我计划把所有资源都放进精灵表,而不是在项目中散落单张图片。
(精灵表预览已省略)
GameManager 重构
我对代码做了一些重大改动。之前重要的逻辑分散在多个地方,现在我把大部分需要的内容集中到一个名为 GameManager 的脚本中。它负责共享数据和全局行为,如得分、生命以及游戏结束逻辑。
extends Node
signal lives_changed(new_lives)
signal score_changed(new_score)
var lives = 3
var current_score = 0
# ---- Score handling ----
func _update_score(fish_score):
current_score += fish_score
score_changed.emit(current_score)
# ---- Health handling ----
func _decrease_life():
if lives > 0:
lives -= 1
lives_changed.emit(lives)
if lives == 0:
_game_over()
# ---- Game over UI ----
func _game_over():
var game_over_scene = preload("uid://behejrhw6wlo7")
var game_over_instance = game_over_scene.instantiate()
var GameOverCanvas = get_node("/root/MainScene/GameOverCanvas")
GameOverCanvas.add_child(game_over_instance)
get_tree().paused = true
生命和游戏结束系统仍在完善中,但得分系统已经可以使用。
鱼脚本交互
@export var fish_score = 1
func _on_body_entered(body):
if body.is_in_group("Player"):
GameManager._update_score(fish_score)
queue_free()
当鱼与玩家碰撞时,会调用 GameManager 单例中的 _update_score。该函数更新总得分并发出信号,UI 监听该信号以更新得分计数器。
流程:
玩家捕获鱼 → 调用 GameManager 中的 _update_score → 当前得分(初始为 0)增加鱼的分值 → 发出 score_changed 信号 → UI 更新。
我花了一段时间才弄明白,因为之前没有在 Godot 中使用过单例。看了一个短视频并进行实验后,才恍然大悟。
接下来会做什么?
在下一篇文章中,我会更深入地探讨 GameManager,展示它如何与 UI 连接,完善生命系统,并引入炸弹机制。
欢迎留下评论或反馈。我仍在学习中,可能会犯错。