本文作为csdn博主【开发游戏的老王】的思考题的回答:如何实现AnimationPlayer在FlappyBird中的停止问题。
【实现AnimationPlayer无限地板的链接】
【提出问题的链接】
按道理,当游戏结束之后,随着小鸟的停止运动,地板的移动也应该停止。
我们来看一下老师的代码。
#Floor.gd
extends Sprite
func _ready():
add_to_group("GAME_STATE")
func on_game_over():
material.set_shader_param("speed",0)
大意就是在on_game_over函数中让shader的速度为零
而对on_game_over函数的调用在bird.gd中
#bird.gd
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方法【在这儿】
那么,意思就是 当游戏结束后,程序会进入on_body_entered函数。并且调用它后面的代码完成收尾工作并停止地板的运动。
考虑到AnimationPlayer版中使用了两个Sprite对象来实现地板的移动,为了不把停止代码在两个对象所对应的脚本中重复导致累赘。我考虑这样完成:
在AnimationPlayer中选择加入代码,代码如下
#AnimationPlayer.gd
extends AnimationPlayer
func _ready():
add_to_group("GAME_STATE")
self.play("floor_1")
self.play("floor_2")
func stop_an():
self.stop()
并且在bird.gd中加入一句(最后一句)
#bird.gd
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")
get_tree().call_group("GAME_STATE","stop_an")#调用函数完成动画的停止工作
至此,停止无限地面之AnimationPlayer版就算实现了