[手把手带你Godot游戏开发]FlappyBird:9.1 天下没有不OVER的GAME(上)

Hanna ·
更新时间:2024-09-21
· 919 次阅读

本章节效果图

在这里插入图片描述

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

1.小鸟“失控”坠落2.停止制造新的水管3.现存水管停止运动4.得分区域停止触发5.地面停止滚动6. 游戏结束的UI弹出 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 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)#得分区域停止触发 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弹出

本部分内容较多,将在下节继续


作者:开发游戏的老王



over godot

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章