设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4669|回复: 15
打印 上一主题 下一主题

[有事请教] 关于$gameTemp.reserveCommonEvent(id)这个脚本的BUG

[复制链接]

Lv1.梦旅人

梦石
0
星屑
34
在线时间
5 小时
注册时间
2020-4-2
帖子
9
跳转到指定楼层
1
发表于 2020-4-3 11:21:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
大佬们都应该知道这个脚本是运行公共事件的脚本。但是有一个BUG我不知道是我自己的问题,还是大家都一样。
脚本BUG:使用脚本同时运行多个公共事件时会出现,只运行最后一个公共事件的情况
对比事件页运行公共事件:同时运行多个公共事件,会同时运行多个公共事件

请问下大佬们,这个情况该怎么解决。。
(特意注册了这个论坛当了一次伸手党。。大佬轻喷)

Lv3.寻梦者

梦石
0
星屑
3375
在线时间
277 小时
注册时间
2019-4-23
帖子
202
15
发表于 2020-4-5 12:50:32 | 只看该作者
zths 发表于 2020-4-4 19:42
$gameMap._interpreter.setupChild($dataCommonEvents[3].list, 0);
或者
$gameTroop._interpreter.setup ...

芯☆淡茹水大佬 已经给你解决了吧
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3375
在线时间
277 小时
注册时间
2019-4-23
帖子
202
14
发表于 2020-4-5 12:49:47 | 只看该作者
soulsaga 发表于 2020-4-4 19:29
this.setupChild($dataCommonEvents[3].list, 0)[/pre]
讲真我不是很明白this是指什么对象.. ...

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

如果你不会脚本又确实需要,我可以帮你弄下....
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33608
在线时间
5108 小时
注册时间
2012-11-19
帖子
4878

开拓者

13
发表于 2020-4-5 11:20:10 | 只看该作者
这样?
  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. };
复制代码
xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5326
在线时间
750 小时
注册时间
2018-1-16
帖子
152
12
发表于 2020-4-5 00:39:23 | 只看该作者
一个脚本框写一条运行代码,然后加等待1帧,后面再写另一个脚本框。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
11
发表于 2020-4-4 19:42:16 | 只看该作者
本帖最后由 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);


大概是这样 代码没测过。
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36586
在线时间
10832 小时
注册时间
2009-3-15
帖子
4817
10
发表于 2020-4-4 19:29:52 | 只看该作者
fengci123 发表于 2020-4-3 18:38
大佬,再打扰一下!
关于脚本运行多个公共事:$gameTemp.reserveCommonEvent(id);

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

讲真我不是很明白this是指什么对象..
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
34
在线时间
5 小时
注册时间
2020-4-2
帖子
9
9
 楼主| 发表于 2020-4-3 18:38:34 | 只看该作者
q3226257 发表于 2020-4-3 14:06
本身就是这个效果,reserveCommonEvent只是将当前公共事件id给赋值了,然后会被系统检测到就去执行,
你多 ...

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

萌新真的不懂,能不能给个具体的代码。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
34
在线时间
5 小时
注册时间
2020-4-2
帖子
9
8
 楼主| 发表于 2020-4-3 18:35:20 | 只看该作者
阵颜 发表于 2020-4-3 18:25
如果你只是想执行 公共事件1,公共事件2,公共事件3 的话
就新建一个公共事件4,里面引用公共事件1,公共事 ...

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

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
14329
在线时间
5242 小时
注册时间
2017-2-18
帖子
392
7
发表于 2020-4-3 18:25:08 | 只看该作者
如果你只是想执行 公共事件1,公共事件2,公共事件3 的话
就新建一个公共事件4,里面引用公共事件1,公共事件2,公共事件3
然后$gameTemp.reserveCommonEvent(4)
化而为鸟,其名为鸽。怒而咕,咕咕咕咕——咕咕咕!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-23 03:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表