【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)

效果图

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第1张图片

目录

      • 1. 应用的总调度:Application场景
      • 2. 万物归“零”
        • 无尽地面归零
        • 本局分数归零
      • 3. 万事俱备,只欠触发
      • 4. 运行游戏

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

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

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

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第2张图片

保存"Application"场景

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第3张图片
在项目设置中将"Application"设置为Main Scene(主场景,即:是游戏运行时的默认场景)
【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第4张图片

#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)
  • 本局分数归零

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第5张图片

#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
【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第6张图片

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第7张图片

4. 运行游戏

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

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

【手把手带你Godot游戏开发】FlappyBird:10 大不了从头再来(新局启动)_第8张图片

你可能感兴趣的:(Godot笔记,老王的游戏开发教程,手把手带你Godot游戏开发,游戏开发,Godot,开发游戏的老王)