- 出道即巅峰,先做个盈利千万的小项目
- 新建 Godot 项目
- Godot 界面介绍
- FlappyBird:1.Hello World
- FlappyBird:2.坠落吧,小鸟
- FlappyBird:3.在哪坠落就在哪飞起来
- FlappyBird:4. 无限地面
- FlappyBird:4.1 无限地面之 Godot 青年 (AnimationPlayer) 版
- FlappyBird:4.2 无限地面之普通青年版
- FlappyBird:4.3 无限地面之文艺青年(shader) 版
- FlappyBird:5.1 无尽水管子滚滚来(一)
- Godot Engine:5 种碰撞体以及 RigidBody 的 4 种模式
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 Area2D 碰撞)
- Godot Engine:碰撞和碰撞检测的简单实例(RigidBody2D 与 StaticBody2D 碰撞)
- FlappyBird:5.2 无尽水管子滚滚来(二)
- Godot Engine:Timer 节点使用范例
- FlappyBird:6 来点 MUSIC(音效系统)
- Godot Engine:用自动加载(AutoLoad) 实现单例模式(Singleton Pattern)
- FlappyBird:7 心里有数(计分系统)
- Godot Engine:本地数据存取的帮助类(加密/非加密)
- FlappyBird:8 让数据说话(显示分数)
- Godot Engine:如何使用外部字体和 Label 节点制作一个计时器
- FlappyBird:9.1 天下没有不 OVER 的 GAME(上)
- Godot Engine:两行代码实现观察者模式(Observer Pattern),就问你服不服?
- FlappyBird:9.2 天下没有不 OVER 的 GAME(下)
- FlappyBird:10 大不了从头再来(新局启动)
- Godot Engine:用 Call Method Track(方法回调轨道)实现动画回调
- FlappyBird:11 番外篇:罗永浩都抖音了,要不咱们也抖一抖?(屏幕震动)
- Godot Engine:屏幕振动效果的实现
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
FlappyBird:10 大不了从头再来(新局启动)
效果图
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 年…”
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论