Project1

标题: 关于$gameTemp.reserveCommonEvent(id)这个脚本的BUG [打印本页]

作者: fengci123    时间: 2020-4-3 11:21
标题: 关于$gameTemp.reserveCommonEvent(id)这个脚本的BUG
大佬们都应该知道这个脚本是运行公共事件的脚本。但是有一个BUG我不知道是我自己的问题,还是大家都一样。
脚本BUG:使用脚本同时运行多个公共事件时会出现,只运行最后一个公共事件的情况
对比事件页运行公共事件:同时运行多个公共事件,会同时运行多个公共事件

请问下大佬们,这个情况该怎么解决。。
(特意注册了这个论坛当了一次伸手党。。大佬轻喷)
作者: fengci123    时间: 2020-4-3 11:42
至于公共事件的内容。。就算是简单的消息框,也会出现这个问题
作者: q3226257    时间: 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多次赋值一般是只有最后一个生效的,就像a=1,a=2,a=3,最后当然是a=3了,
如果你要解决这个问题,可以自己加个队列,然后一个个执行!
作者: fengci123    时间: 2020-4-3 14:55
q3226257 发表于 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多 ...

大佬可以给个在RMMV内执行多个公共事件的脚本全文吗?我之前在很多地方查询过,包括第一次接触的大佬制作的脚本手册里也没有提过这个东西。希望之后有和我一样的萌新遇到这个问题能够很快地解决。。
作者: fengci123    时间: 2020-4-3 14:57
q3226257 发表于 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多 ...

放入队列的话,还得使用多个对象吧?不然还是会把之前的覆盖了。
作者: fengci123    时间: 2020-4-3 15:02
q3226257 发表于 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多 ...

求大佬教下如何 实现 a=1 , b=2, c=3 ,我真的不知道该如何创建abc,或者如何在输出一个后再重新赋值
作者: 阵颜    时间: 2020-4-3 18:25
如果你只是想执行 公共事件1,公共事件2,公共事件3 的话
就新建一个公共事件4,里面引用公共事件1,公共事件2,公共事件3
然后$gameTemp.reserveCommonEvent(4)
作者: fengci123    时间: 2020-4-3 18:35
阵颜 发表于 2020-4-3 18:25
如果你只是想执行 公共事件1,公共事件2,公共事件3 的话
就新建一个公共事件4,里面引用公共事件1,公共事 ...

这个确实是个办法。但是这样调用的话就还是只用脚本调用了一个公共事件
没有解决根本的问题,就是脚本如何同时运行多个公共事件。

作者: fengci123    时间: 2020-4-3 18:38
q3226257 发表于 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多 ...

大佬,再打扰一下!
关于脚本运行多个公共事:$gameTemp.reserveCommonEvent(id);

萌新真的不懂,能不能给个具体的代码。
作者: soulsaga    时间: 2020-4-4 19:29
fengci123 发表于 2020-4-3 18:38
大佬,再打扰一下!
关于脚本运行多个公共事:$gameTemp.reserveCommonEvent(id);

JAVASCRIPT 代码复制
  1. this.setupChild($dataCommonEvents[3].list, 0)

讲真我不是很明白this是指什么对象..
作者: zths    时间: 2020-4-4 19:42
本帖最后由 zths 于 2020-4-4 19:44 编辑
soulsaga 发表于 2020-4-4 19:29
this.setupChild($dataCommonEvents[3].list, 0)[/pre]
讲真我不是很明白this是指什么对象.. ...


$gameMap._interpreter.setupChild($dataCommonEvents[3].list, 0);
或者
$gameTroop._interpreter.setupChild($dataCommonEvents[3].list, 0);
但这也不是并行执行,是阻塞的。
在当前队列里插入一个子事件,子事件结束后才会。。。。。
setupChild 是 Interpreter对象的方法,所以要正确的插入应该是
递归到最后一个子事件 再调用setupChild
也就是说
funcrtion initNewChildInterpreter(currInterpreter,newInterpreter){
    if(!currInterpreter){return;}
    if(currInterpreter._childInterpreter){
        return initNewChildInterpreter(currInterpreter._childInterpreter,newInterpreter);
    }
    currInterpreter.setupChild(newInterpreter, currInterpreter._depth + 1);
}
var nev = $dataCommonEvents[3];
initNewChildInterpreter($gameMap._interpreter,nev.list);


大概是这样 代码没测过。
作者: shantianzu    时间: 2020-4-5 00:39
一个脚本框写一条运行代码,然后加等待1帧,后面再写另一个脚本框。

作者: 芯☆淡茹水    时间: 2020-4-5 11:20
这样?
  1. Game_Temp.prototype.commonEventReserve = function() {
  2.     return this._commonEventReserve || [];
  3. };
  4. Game_Temp.prototype.addCommonEvent = function(commonEventId) {
  5.     this._commonEventReserve = this._commonEventReserve || [];
  6.     this._commonEventReserve.push(commonEventId);
  7. };
  8. Game_Temp.prototype.hasReserveEvent = function() {
  9.     return this.commonEventReserve().length > 0;
  10. };
  11. var XRCommonEvent_Game_Temp_reserveCommonEvent = Game_Temp.prototype.reserveCommonEvent;
  12. Game_Temp.prototype.reserveCommonEvent = function(commonEventId) {
  13.     if (this.isCommonEventReserved()) this.addCommonEvent(commonEventId);
  14.     else XRCommonEvent_Game_Temp_reserveCommonEvent.call(this, commonEventId);
  15. };
  16. var XRCommonEvent_Game_Temp_clearCommonEvent = Game_Temp.prototype.clearCommonEvent;
  17. Game_Temp.prototype.clearCommonEvent = function() {
  18.     XRCommonEvent_Game_Temp_clearCommonEvent.call(this);
  19.     this.hasReserveEvent() && this.reserveCommonEvent(this.commonEventReserve().shift());
  20. };
复制代码

作者: q3226257    时间: 2020-4-5 12:49
soulsaga 发表于 2020-4-4 19:29
this.setupChild($dataCommonEvents[3].list, 0)[/pre]
讲真我不是很明白this是指什么对象.. ...

额 this这个其实看具体对象,一般是指你这个类的实例对象,没有编程基础确实不好理解。。。
至于运行多个公共事件,其实楼上说的组合一起我觉的挺好,
如果你确实想用脚本解决,那就自己编写一个 脚本循环去执行就好了,
每执行一个公共事件,就把它加入到队列,然后update的时候如果队列有值,
就取出来执行。。。。

如果你不会脚本又确实需要,我可以帮你弄下....
作者: q3226257    时间: 2020-4-5 12:50
zths 发表于 2020-4-4 19:42
$gameMap._interpreter.setupChild($dataCommonEvents[3].list, 0);
或者
$gameTroop._interpreter.setup ...

芯☆淡茹水大佬 已经给你解决了吧




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1