You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:32:35