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

GameMaker中Boss状态函数队列复用的解决方案咨询

GameMaker Boss状态函数队列复用解决方案

核心思路:别直接修改原函数数组,加个索引变量跟踪当前执行位置,原数组完整保留,下次进状态重置索引就行,不用重构大量代码。

修改Create事件代码

在原代码里新增索引变量,用来记录当前执行到队列的第几个函数:

dt = delta_time / 1000000;
time = 0 * dt;

// 原函数队列完全保留,不做任何修改
queue1 = [
    function() {
        obj_pl_um_states.state = states.nopoo;
        audio_play_sound(sou_steam, 0, 0);
        sprite_index = spr_coff_boss_steam;
        image_index = 0;
        path_start(path12, 1, path_action_stop, true);
        return 240; // 控制下一个函数的启动延迟
    },
    function() { // 销毁护盾
        with(obj_forcefield) instance_destroy();
        audio_play_sound(sou_shatter, 1, 0);
        obj_en_coff_boss_states.state = cfbossstates.spin;
    }
];

// 添加队列进度索引,初始设为0(从第一个函数开始执行)
queue1_index = 0;

修改Step事件代码

把删除数组元素的逻辑改成用索引判断,执行完当前函数后只递增索引,不改动原数组:

if (state == cfbossstates.steam) {
    if (time > 0) {
        time -= 1;
    } else {
        // 检查是否还有未执行的函数
        while (queue1_index < array_length(queue1)) {
            var _next = queue1[queue1_index];
            queue1_index += 1; // 索引往后移,无需删除数组元素
            
            var _result = _next();
            
            if (_result != undefined) {
                time = _result;
                break; // 有延迟就暂停,等时间到了再执行下一个
            }
        }
        
        // 队列执行完毕后,重置索引,方便下次进入状态复用
        if (queue1_index >= array_length(queue1)) {
            queue1_index = 0;
        }
    }
}

关键改动说明

  • 原函数数组queue1全程不修改,始终保留所有函数,直接实现复用
  • 用queue1_index跟踪执行进度,每次进入cfbossstates.steam状态时,只要索引是0就会从头开始执行
  • 当队列执行完所有函数后,手动把索引重置为0,下次进入状态就能重新跑一遍整个队列

内容的提问来源于stack exchange,提问作者user15950867

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:54:33