@魔法-爱好者\. 哟。前略。
帖子被抽确实有老夫的锅,虽然规则上来说不是。
首先,创建题设空工程环境,于事件内执行单行脚本“$gameVariables.setValue(15,3);”,运行测试,呼出开发者工具-控制台。
方便测试起见,将方法定义移入新增的插件,并顺手将初始场景由标题界面改为地图界面,并将出生点设为目标事件所在地图。
首先考虑考察目标事件。在所执行脚本上方追加“throw new Error("无事发生。");”,保存后于游戏窗口按下F5。
由下至上依次点击文件链接、考察源码,易知:地图场景中存在对$gameMap._interpreter.update()的调用。
测试毕,将前述追加的抛出语句移除。
则,可以考虑尝试将测试方法修改为:
abcWithOneUpdate = function () {
$gameMap._events[3].start();
$gameMap.updateInterpreter();
return $gameVariables.value(15);
}
保存后于游戏窗口按下F5。
返回前追加的语句也可以替换为形如“setInterval($gameMap.updateInterpreter(), 1);”等的语句,以方便进一步的测试。
至此,考察可得中间结论①:在地图场景中,启动事件后、事件页第一次载入前,地图场景对其主解释器进行过至少一次更新,其可通过形如上述语句的方式手动执行。
故而可继续考察逐层脱离运行环境时、目标事件的响应规律。
经移植代码,通过拆解可知:这一过程中$gameMap.setupStartingMapEvent()需要被执行。从而,上述方法可被削减为:
abcWithOneUpdateNew = function () {
$gameMap._events[3].start();
$gameMap.setupStartingMapEvent();
$gameMap._interpreter.update();
return $gameVariables.value(15);
}
(我是图:)abcWithOneUpdateNew() => 3
进一步地,降解至解释器层,最终可得:
abcNew = function () {
$gameMap._interpreter.setup($gameMap.events()[2].list(), 3);
$gameMap._interpreter.update();
return $gameVariables.value(15);
}
(我也是图:)abcNew() => 3
其中事件列表为数组,故序号2中存有事件3,后续参数为事件ID,本例中可以瞎填,虽然不建议。显然,至此,执行过程已不适合进一步简化——除非再降一层:
TheRealabc = function () {
$gameMap.events()[3 - 1]._interpreter = new Game_Interpreter();
$gameMap.events()[3 - 1].updateParallel();
return $gameVariables.value(15);
}
(我还是图:)TheRealabc() => 3
现在我们得到了中间结论②:一个为目标事件创建独立解释器的、所谓真实版本的abc()——其是否具备某些不可替代的优越性呢?
考虑运行环境,重新考察abcWithOneUpdate()。
在所执行脚本上方追加事件行“等待1帧”,F5。
(我们中有图背叛了我:)abcWithOneUpdate() => 0
将刷新语句替换为“setInterval($gameMap.updateInterpreter(), 100);”,F5。
(门图们作大惊状:)abcWithManyUpdates() => 0
易知仅刷新主解释器对于无法在1帧内执行完的事件起不到等待至结束的作用。
进一步考察未处于闲置状态的地图场景、以及其它运行环境时的响应。
后略。
——dspzzy