效果图
目录1. 应用的总调度:Application场景2. 万物归“零”无尽地面归零本局分数归零3. 万事俱备,只欠触发4. 运行游戏 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"方法
...
那么我们应该在什么时候开始新的一局呢?
“在小鸟碰到柱子时!!!”小明同学抢答道(这是我临时杜撰的角色)
“错!”老王说:“碰到柱子以后,我们好歹得让玩家瞅清楚本局分数再开始下一局啊!”
所以一个不错的方案是:
小鸟死亡 信息版升起 玩家看清了分数,再次点击屏幕开始新的一局所以在实现本部分之前,请先阅读一下 《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
由于我们为游戏设置了主场景"Application",所以这次我们直接按F5
就可以直接运行游戏啦!
游戏完工,老王不禁泪流满面:“多么希望现在是2014年…”