- 出道即巅峰,先做个盈利千万的小项目
- 新建 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:9.1 天下没有不 OVER 的 GAME(上)
本章节效果图
小鸟撞上水管标志着一局游戏的结束,我们会用两个章节为它做一些收尾工作:
1.小鸟“失控”坠落
失控指的是发生碰撞以后,小鸟将无法再次受用户控制飞起来
# Bird.gd
extends RigidBody2D
func _ready():
connect("body_entered",self,"on_body_entered")
func _physics_process(delta):
if Input.is_mouse_button_pressed(1):
AudioManager.play("sfx_swooshing")
linear_velocity = Vector2.UP*500
angular_velocity = -3.0
if rotation_degrees < -30:
rotation_degrees = -30
angular_velocity = 0
if linear_velocity.y > 0.0:
angular_velocity = 1.5
func on_body_entered(_body):
if _body is StaticBody2D:#碰撞以后
call_deferred("set_physics_process",false)#停用_physics_process(delta)
call_deferred("set_contact_monitor",false)#关闭碰撞检测
AudioManager.play("sfx_hit")#播放碰撞音效
$AnimationPlayer.play("die")#动画切换到死亡状态
GameData.update_record()#更新最好成绩记录
get_tree().call_group("GAME_STATE","on_game_over")#调用 GAME_STATE 的 on_game_over 方法
2.停止制造新的水管
#PipeManager.gd
extends Timer
var pipe_scn = preload("res://Objects/Pipe.tscn")
func _ready():
add_to_group("GAME_STATE")#加入 GAME_STATE 组
connect("timeout",self,"on_timeout")
func on_timeout():
var pipe = pipe_scn.instance()
add_child(pipe)
func on_game_over():
paused = true#停止计时
3.现存水管停止运动
#Pipe.gd
extends Node2D
func _ready():
add_to_group("GAME_STATE") #加入 GAME_STATE 组
position.y += randf()*300-150
func _process(delta):
position += Vector2.LEFT*200.0*delta
if position.x < 0:
queue_free()
func on_game_over():
set_process(false) #停用_process(delta)
4.得分区域停止触发
这个部分主要是防止某些时候,小鸟已经死亡,但是依然滚出得分区,从而触发得分。当然如果你设定的游戏规则允许这种情况发生,那么这一步可以不处理
#ScoreArea.gd
extends Area2D
func _ready():
add_to_group("GAME_STATE")
connect("body_exited",self,"_on_body_exited")
func _on_body_exited(_body):
if _body.name == "Bird":
AudioManager.play("sfx_point")
GameData.score += 1
#加分以后通过 SceenTree 把新的分数更新给所有想接受这个消息的节点
get_tree().call_group("SCORE","on_score_updated",GameData.score)
func on_game_over():
#call_deferred("set_monitoring",false)
disconnect("body_exited",self,"_on_body_exited")#得分区域停止触发
5.地面停止滚动
还记得吗?地面无限滚动我们使用了 3 种方法实现,本节采用的是“文艺青年版”。如果你使用的是其它版本,就把本部分作为一个思考问题吧!
#Floor.gd
extends Sprite
func _ready():
add_to_group("GAME_STATE")
func on_game_over():
material.set_shader_param("speed",0)
6. 游戏结束的 UI 弹出
本部分内容较多,将在下节继续
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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