Project1
标题: 【已解决】上一行代码还没运行完毕下一行代码已经在跑了 [打印本页]
作者: 新耀012478 时间: 2021-12-20 18:36
标题: 【已解决】上一行代码还没运行完毕下一行代码已经在跑了
本帖最后由 新耀012478 于 2021-12-28 02:10 编辑
新人,只是业余看了些教程学了点代码,对编程的很多东西不是很懂,如果哪里搞错了什么请大佬轻喷。
事情经过,之前发了个怎么在变量修改时找改它的代码的帖子,今天又试了一下,才发现不是我以为的问题。
实际上我已经找到了修改那个变量的位置,但是我加的代码是event.start();就是让它在执行接下来的代码之前先执行游戏事件页的内容。
然而我把游戏事件页的内容直接加在这里的时候,效果就变成我原先想实现的样子了。
于是就很奇怪,明明都是一样的东西,为什么event.start();就不行?而且也是加在同一个位置啊,难道不是上面的代码执行完以后再执行下面的代码的吗?
作者: 新耀012478 时间: 2021-12-25 18:53
果然,我弄了个一模一样的情况,大家自己可以试一下:
三号事件:$gameVariables.setValue(15,3);
abc=function(){$gameMap._events[3].start();return $gameVariables.value(15);}
然后诡异的事情发生了,它的返回值是0,然后我再输入一遍$gameVariables.value(15),它又说是3了。
也就是说是不是前面的代码没执行完后面的代码就已经开始执行了,所以才会变成这样?
作者: 新耀012478 时间: 2021-12-26 01:28
空循环等返回值结束会导致卡死,至于if……那根本没用。可以自己试试。而且想想吧,if也是代码,一样的啊。
我上网搜了下查到了什么异步还有回调函数,我也不知道我有没有理解,但是我试了一下不行……
然后我看了一下object里关于Game_Event.prototype.start的部分,发现它还调用了其它的函数……恐怕是同样的原因,start()并不是最后那个,所以在这里加了没用……然而它之后一个函数调用另一个函数,另一个函数再调用下一个函数……我简直被它绕晕了,具体执行的不知道在哪里。
因为我要手动设置战棋AI的行动模式,所以肯定要用到事件页执行,改这玩意儿可比我想得难多了,论坛里有JS大神不?求帮个忙
作者: lisliz 时间: 2021-12-27 14:52
start是异步的
作者: 新耀012478 时间: 2021-12-28 02:19
@夏虫沉默
我不知道我有没有理解对,如果说错了请轻喷。
我感觉好像不适用回调函数的情况?毕竟我只是输入了参数,而输入数据的函数跟执行的函数之间没有关联啊。我看网上的例子,自己理解是把A设置成回调函数,让它回调个B,那么A执行完以后会执行B。可是start跟setup都只是设置了数字就完事了,没有连接到由update下辖的executeCommand,它不是要在函数里写了别的函数名才会自己转过去的吗?
这问题是解决了,我把它接下来需要执行的代码挪了个地方……就好了……我后来在网上看异步的时候有看到什么作用域,还有异步到底是在什么时候才执行的演示啥的。
我就想虽然这个AI没有按我事件页设置的行动,但是它同数据库敌人ID的下一个敌人是可以的。那么说那个什么异步应该是执行了的。
所以我就把它执行的代码挪位置了。我也不知道我理解对了没,但是生效了。
作者: 夏虫沉默 时间: 2021-12-28 10:24
本帖最后由 夏虫沉默 于 2021-12-28 18:34 编辑
我实测了一下,事件1脚本:abc=function(){
$gameMap._events[3].start();
console.log($gameVariables.value(15));
return $gameVariables.value(15);
}();
abc=function(){
$gameMap._events[3].start();
console.log($gameVariables.value(15));
return $gameVariables.value(15);
}();
事件2脚本console.log($gameVariables.value(15));
console.log($gameVariables.value(15));
事件3脚本$gameVariables.setValue(15,3);
$gameVariables.setValue(15,3);
先和事件1对话,控制台输出0,再和事件2对话,控制台输出3,就算我事件1里单独把$gameMap._events[3].start()抽出执行,等待2秒,结果依然没有变化;这个可能是MV解释器设置了某些限制,在一个事件中只能先运行完当前的事件内容,然后再运行其他事件的内容原来是异步的代码优先级总是次于同步的代码
作者: 新耀012478 时间: 2021-12-28 18:08
我是看四楼和网络上搜到的内容的,它们说这个叫异步,然后网上说JS里异步的代码必然发生在同步代码之后,所以不行,我也去搜了将异步改同步什么的,没有结果,我搜到的解决办法只有回调函数。
然后事件一的内容我是用F12执行的,不是在事件里执行的。这个例子原本也不是在事件里执行,是在插件里执行的,所以我想应该不是你说的那个限制的问题。
呃,当然我只是遇到问题优先搜索引擎,实在搜不到再来论坛问的小白而已,对这些理解难免有误,我以为我解决了是因为我在网上看到的什么作用域的词语,然后贴吧一个好像是JS老手的人就说不是,
以下()是一些牢骚,虽然它有地方让我不爽,但没办法,它学得时间比我长,我记得你好像回复了我很多关于代码的问题,都是发过去以后等了好几天却连一个回复都没有的那种,我感觉你好像很明白代码的问题,我承认我的问题是有些厚脸皮了,因为那个人说要读很久的书才能明白,它说我以为的作用域的理解是错误的,真正的原因是别的。
呃其实我只是好奇,用的话我也不知道用不用得到,不能也没关系。啊,()后面就没有了,因为正事得放在前面嘛。他说“只是因为各场景的主解释器沿用了list用完就清空的逻辑”,我也看不懂是什么意思……我猜是不是这样一来同步的部分就算是结束了,可以执行异步了呢。
(虽然他有个地方让我不爽,他说发帖求助说是什么版本应该是基本礼仪才对,这个确实我直接把论坛里的求助帖复制过去了就遗忘了,但是我后来反应过来,按F12然后敲代码很足以体现不是VA及之前版本了,因为之前的根本没这个功能。可是他却说我那个是伪命题,自虐的话还是可以用JS,还说要拿我这帖当新手常犯错误的示例。
如果能让我这帖帮更多新手避免错误我是很开心,因为我搜索引擎搜到的问题也是别的新手问了他们不懂的地方,我才能剩下很多直接去学习JS的麻烦。但是综合这几句话来看却未免让人有些不舒服。我明明是新手也说要拿它当新手示例,却要我知道只有老手才知道的可以在RUBY里使用JS吗?以我一个新手的角度来说,按F12敲代码是MV/MZ的特性,已经很足以说明我用的是什么版本了才对。)
作者: 夏虫沉默 时间: 2021-12-28 19:09
本帖最后由 夏虫沉默 于 2021-12-28 19:15 编辑
同步,异步执行顺序可以参考下这篇文章,异步代码比同步代码慢的话,可以把之前的事件1第3行修改为setTimeout(()=>{console.log($gameVariables.value(15))},0);//0延迟后打印变量15的值
setTimeout(()=>{console.log($gameVariables.value(15))},0);//0延迟后打印变量15的值
套一层setTimeout把同步的部分也改为异步代码,打印结果就变成3了。
顺便说一句,对学习只要能够达到正常可以使用的地步,有时候也不用治经为博士
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |