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
相关产品推荐
相关产品推荐

