返回介绍

FlappyBird:9.1 天下没有不 OVER 的 GAME(上)

发布于 2025-04-26 18:34:24 字数 3272 浏览 0 评论 0 收藏

本章节效果图

小鸟撞上水管标志着一局游戏的结束,我们会用两个章节为它做一些收尾工作:

 

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。