Game Maker中播放完攻击序列动画后如何正确销毁序列?
解决序列播放完成后销毁的问题
方法1:通过序列播放状态判断销毁时机
把创建的序列实例保存为实例变量(比如attack_seq),然后在Step事件中持续检查序列状态,当播放结束时再执行销毁:
// Step事件代码 if (instance_exists(attack_seq) && !sequence_is_playing(attack_seq)) { Layer_destroy_sequence(attack_seq); attack_seq = noone; // 重置变量,避免后续误判 }
触发播放的逻辑保持不变,只需把序列实例赋值给实例变量:
// 冷却归0且按下Q键时的代码 if (cool_down <= 0 && keyboard_check_pressed(vk_q)) { cool_down = COOL_DOWN_TIME; // 重置冷却 attack_seq = Layer_create_sequence(layer, x, y, seq_attack); }
方法2:绑定序列结束回调函数
先创建一个回调脚本(比如seq_destroy_on_end):
function seq_destroy_on_end(_seq) { Layer_destroy_sequence(_seq); }
然后在创建序列时绑定这个回调,序列播放完成后会自动触发销毁:
if (cool_down <= 0 && keyboard_check_pressed(vk_q)) { cool_down = COOL_DOWN_TIME; var seq = Layer_create_sequence(layer, x, y, seq_attack); sequence_set_end_callback(seq, seq_destroy_on_end); }
方法3:用Alarm延迟销毁
已知序列共12帧,直接设置对应帧数的Alarm来触发销毁:
// 触发播放时的代码 if (cool_down <= 0 && keyboard_check_pressed(vk_q)) { cool_down = COOL_DOWN_TIME; attack_seq = Layer_create_sequence(layer, x, y, seq_attack); alarm[0] = 12; // 12帧后执行Alarm0 }
在Alarm 0事件中添加销毁逻辑:
if (instance_exists(attack_seq)) { Layer_destroy_sequence(attack_seq); attack_seq = noone; }
注意事项
- 所有销毁操作前必须先通过
instance_exists()判断序列是否存在,避免出现“无法销毁不存在的序列”的错误 - 绝对不能在创建序列的同一帧直接调用销毁,否则序列还未播放就被删除
内容的提问来源于stack exchange,提问作者RetroAnt
相关产品推荐
相关产品推荐

