返回介绍

FlappyBird:10 大不了从头再来(新局启动)

发布于 2025-04-26 18:34:24 字数 3806 浏览 0 评论 0 收藏

效果图

1. 应用的总调度:Application 场景

新建一个 Node 类型节点,更名为"Application",并为其添加脚本"Application.gd",这个场景将成为整个游戏的“总调度”节点

注意: 由于 Godot Engine 的节点系统非常灵活,我的组织方式只是一种思路,并不是唯一方法。

保存"Application"场景


在项目设置中将"Application"设置为 Main Scene(主场景,即:是游戏运行时的默认场景)

#Application.gd
extends Node

var game_tscn = preload("res://Game.tscn")#把"Game.tscn"预加载进来

func _ready():
	add_to_group("GAME_STATE")#把自己加入"GAME_STATE"组
	get_tree().call_group("GAME_STATE","on_game_start")#调用"GAME_STATE"组的"on_game_start"方法
	
func on_game_start():
	var game = get_node_or_null("Game")#判断是否有名为"Game"的子节点
	if game != null: #判断是否有名为"Game"的子节点,如果有则移除并释放
		remove_child(game)
		game.queue_free()
	game = game_tscn.instance()#然后实例化一个新的"Game.tscn"并作为自己的子节点,开始新的一局
	add_child(game)

2. 万物归“零”

这里的归“零”指的是游戏中的元素回归到游戏刚开始的状态

  • 无尽地面归零

#Floor.gd
extends Sprite

func _ready():
	add_to_group("GAME_STATE")
	material.set_shader_param("speed",0.2) #游戏开始时地面运动速度设为 0.2

func on_game_over():
	material.set_shader_param("speed",0)
  • 本局分数归零

#Game.gd
extends Node

func _ready():
	GameData.score = 0

3. 万事俱备,只欠触发

在"Application.gd"的代码中,我们已经看出一些端倪,下面的代码就是新一局开始的触发器

#Application.gd
...
get_tree().call_group("GAME_STATE","on_game_start")#调用"GAME_STATE"组的"on_game_start"方法
...

那么我们应该在什么时候开始新的一局呢?

“在小鸟碰到柱子时!!!”小明同学抢答道(这是我临时杜撰的角色)
“错!”老王说:“碰到柱子以后,我们好歹得让玩家瞅清楚本局分数再开始下一局啊!”

所以一个不错的方案是:

  1. 小鸟死亡
  2. 信息版升起
  3. 玩家看清了分数, 再次点击屏幕 开始新的一局

所以在实现本部分之前,请先阅读一下 《Godot Engine:用 Call Method Track(方法回调轨道)实现动画回调》 一文,你将学会如何让动画触发回调函数。

先回到"InfoBoard.gd"添加一些代码

#InfoBoard.gd
extends TextureRect

func _ready():
	add_to_group("GAME_STATE")
	set_process(false)#刚开局先停用_process(delta) 方法


func on_game_over():
	$LabelCurrent.text = str(GameData.score)
	$LabelRecord.text = str(GameData.load_record())
	$AnimationPlayer.play("show")

func _process(delta):#一旦开启_process(delta),用户再次点击屏幕,将开始新的一局
	if Input.is_mouse_button_pressed(1):
		get_tree().call_group("GAME_STATE","on_game_start")

func on_board_shown():#由动画触发的回调函数,负责开启_process(delta) 方法
	set_process(true)

在"UI"场景中添加一个 AnimationPlayer

4. 运行游戏

由于我们为游戏设置了主场景"Application",所以这次我们直接按 F5 就可以直接运行游戏啦!

游戏完工,老王不禁泪流满面:“多么希望现在是 2014 年…”

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。