Este artículo responde como pregunta de pensamiento de un blogger csdn [Lao Wang del desarrollo del juego]: Cómo darse cuenta de la parada de AnimationPlayer en FlappyBird.
[Realice el enlace del piso ilimitado AnimationPlayer] [ Enlace para
hacer una pregunta]
Es lógico pensar que cuando el juego termina, cuando el pájaro deja de moverse, el movimiento del piso también debe detenerse.
Echemos un vistazo al código del profesor.
#Floor.gd
extends Sprite
func _ready():
add_to_group("GAME_STATE")
func on_game_over():
material.set_shader_param("speed",0)
La idea es hacer que la velocidad del sombreador sea cero en la función on_game_over
Y la llamada a la función on_game_over está en 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方法【在这儿】
Entonces, significa que cuando el juego termine, el programa ingresará a la función on_body_entered. Y llame al código detrás de él para completar el trabajo de acabado y detener el movimiento del piso.
Teniendo en cuenta que se utilizan dos objetos Sprite en la versión AnimationPlayer para realizar el movimiento del piso, a fin de no repetir el código de detención en el script correspondiente a los dos objetos, esto causa molestia. Considero hacer esto:
Elija agregar el código en AnimationPlayer, el código es el siguiente
#AnimationPlayer.gd
extends AnimationPlayer
func _ready():
add_to_group("GAME_STATE")
self.play("floor_1")
self.play("floor_2")
func stop_an():
self.stop()
Y agregue una oración (la última oración) en 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")#调用函数完成动画的停止工作
En este punto, incluso si la versión AnimationPlayer del terreno infinito se realiza