效果圖
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
4. 運行遊戲
由於我們爲遊戲設置了主場景"Application",所以這次我們直接按F5
就可以直接運行遊戲啦!
遊戲完工,老王不禁淚流滿面:“多麼希望現在是2014年…”