【Godot游戏开发】FlappyBird:9.1-2停止无限地面之AnimationPlayer版

本文作为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版就算实现了

发布了1 篇原创文章 · 获赞 4 · 访问量 778

猜你喜欢

转载自blog.csdn.net/weixin_46359868/article/details/105425905