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

Project1

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

[有事请教] 【已解决】上一行代码还没运行完毕下一行代码已经在跑了

[复制链接]

Lv2.观梦者

梦石
0
星屑
848
在线时间
117 小时
注册时间
2018-4-7
帖子
114
跳转到指定楼层
1
发表于 2021-12-20 18:36:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 新耀012478 于 2021-12-28 02:10 编辑

新人,只是业余看了些教程学了点代码,对编程的很多东西不是很懂,如果哪里搞错了什么请大佬轻喷。
事情经过,之前发了个怎么在变量修改时找改它的代码的帖子,今天又试了一下,才发现不是我以为的问题。
实际上我已经找到了修改那个变量的位置,但是我加的代码是event.start();就是让它在执行接下来的代码之前先执行游戏事件页的内容。
然而我把游戏事件页的内容直接加在这里的时候,效果就变成我原先想实现的样子了。
于是就很奇怪,明明都是一样的东西,为什么event.start();就不行?而且也是加在同一个位置啊,难道不是上面的代码执行完以后再执行下面的代码的吗?

Lv2.观梦者

梦石
0
星屑
848
在线时间
117 小时
注册时间
2018-4-7
帖子
114
2
 楼主| 发表于 2021-12-25 18:53:52 | 只看该作者
果然,我弄了个一模一样的情况,大家自己可以试一下:
三号事件:$gameVariables.setValue(15,3);
abc=function(){$gameMap._events[3].start();return $gameVariables.value(15);}
然后诡异的事情发生了,它的返回值是0,然后我再输入一遍$gameVariables.value(15),它又说是3了。
也就是说是不是前面的代码没执行完后面的代码就已经开始执行了,所以才会变成这样?

点评

我对匿名函数的理解有误,↓和↓↓行的内容划去[s][/s]  发表于 2021-12-28 09:20
匿名函数的特点是会自动运行一次,关于这段测试,你也可以去掉abc的部分,结果应该没有差别  发表于 2021-12-28 08:28
按我的理解,在事件里的脚本外面也是有一层函数的,然后你的函数内有一个匿名函数(虽然叫他abc),函数会优先执行下面这一行,然后再让变量为3  发表于 2021-12-28 08:24
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
848
在线时间
117 小时
注册时间
2018-4-7
帖子
114
3
 楼主| 发表于 2021-12-26 01:28:55 | 只看该作者
空循环等返回值结束会导致卡死,至于if……那根本没用。可以自己试试。而且想想吧,if也是代码,一样的啊。
我上网搜了下查到了什么异步还有回调函数,我也不知道我有没有理解,但是我试了一下不行……
然后我看了一下object里关于Game_Event.prototype.start的部分,发现它还调用了其它的函数……恐怕是同样的原因,start()并不是最后那个,所以在这里加了没用……然而它之后一个函数调用另一个函数,另一个函数再调用下一个函数……我简直被它绕晕了,具体执行的不知道在哪里。
因为我要手动设置战棋AI的行动模式,所以肯定要用到事件页执行,改这玩意儿可比我想得难多了,论坛里有JS大神不?求帮个忙

点评

异步的回调函数,你可以参考下这篇博客https://www.cnblogs.com/fahuibuguangfan/p/9508946.html  发表于 2021-12-27 23:08
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5060
在线时间
705 小时
注册时间
2018-12-11
帖子
241
4
发表于 2021-12-27 14:52:02 | 只看该作者
start是异步的
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
848
在线时间
117 小时
注册时间
2018-4-7
帖子
114
5
 楼主| 发表于 2021-12-28 02:19:04 | 只看该作者
@夏虫沉默
我不知道我有没有理解对,如果说错了请轻喷。
我感觉好像不适用回调函数的情况?毕竟我只是输入了参数,而输入数据的函数跟执行的函数之间没有关联啊。我看网上的例子,自己理解是把A设置成回调函数,让它回调个B,那么A执行完以后会执行B。可是start跟setup都只是设置了数字就完事了,没有连接到由update下辖的executeCommand,它不是要在函数里写了别的函数名才会自己转过去的吗?
这问题是解决了,我把它接下来需要执行的代码挪了个地方……就好了……我后来在网上看异步的时候有看到什么作用域,还有异步到底是在什么时候才执行的演示啥的。
我就想虽然这个AI没有按我事件页设置的行动,但是它同数据库敌人ID的下一个敌人是可以的。那么说那个什么异步应该是执行了的。
所以我就把它执行的代码挪位置了。我也不知道我理解对了没,但是生效了。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1830
在线时间
314 小时
注册时间
2021-11-7
帖子
165
6
发表于 2021-12-28 10:24:11 | 只看该作者
本帖最后由 夏虫沉默 于 2021-12-28 18:34 编辑
新耀012478 发表于 2021-12-25 18:53
果然,我弄了个一模一样的情况,大家自己可以试一下:
三号事件:$gameVariables.setValue(15,3);
abc=func ...


我实测了一下,事件1脚本:
JAVASCRIPT 代码复制
  1. abc=function(){
  2. $gameMap._events[3].start();
  3. console.log($gameVariables.value(15));
  4. return $gameVariables.value(15);
  5. }();

事件2脚本
JAVASCRIPT 代码复制
  1. console.log($gameVariables.value(15));

事件3脚本
JAVASCRIPT 代码复制
  1. $gameVariables.setValue(15,3);

先和事件1对话,控制台输出0,再和事件2对话,控制台输出3,就算我事件1里单独把$gameMap._events[3].start()抽出执行,等待2秒,结果依然没有变化;这个可能是MV解释器设置了某些限制,在一个事件中只能先运行完当前的事件内容,然后再运行其他事件的内容原来是异步的代码优先级总是次于同步的代码
欲速春风山劝阻,不得恰恰不得呼。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
848
在线时间
117 小时
注册时间
2018-4-7
帖子
114
7
 楼主| 发表于 2021-12-28 18:08:22 | 只看该作者
夏虫沉默 发表于 2021-12-28 10:24
我实测了一下,事件1脚本:abc=function(){
$gameMap._events[3].start();
console.log($gameVariables.v ...

我是看四楼和网络上搜到的内容的,它们说这个叫异步,然后网上说JS里异步的代码必然发生在同步代码之后,所以不行,我也去搜了将异步改同步什么的,没有结果,我搜到的解决办法只有回调函数。
然后事件一的内容我是用F12执行的,不是在事件里执行的。这个例子原本也不是在事件里执行,是在插件里执行的,所以我想应该不是你说的那个限制的问题。
呃,当然我只是遇到问题优先搜索引擎,实在搜不到再来论坛问的小白而已,对这些理解难免有误,我以为我解决了是因为我在网上看到的什么作用域的词语,然后贴吧一个好像是JS老手的人就说不是,
以下()是一些牢骚,虽然它有地方让我不爽,但没办法,它学得时间比我长,我记得你好像回复了我很多关于代码的问题,都是发过去以后等了好几天却连一个回复都没有的那种,我感觉你好像很明白代码的问题,我承认我的问题是有些厚脸皮了,因为那个人说要读很久的书才能明白,它说我以为的作用域的理解是错误的,真正的原因是别的。
呃其实我只是好奇,用的话我也不知道用不用得到,不能也没关系。啊,()后面就没有了,因为正事得放在前面嘛。他说“只是因为各场景的主解释器沿用了list用完就清空的逻辑”,我也看不懂是什么意思……我猜是不是这样一来同步的部分就算是结束了,可以执行异步了呢。
(虽然他有个地方让我不爽,他说发帖求助说是什么版本应该是基本礼仪才对,这个确实我直接把论坛里的求助帖复制过去了就遗忘了,但是我后来反应过来,按F12然后敲代码很足以体现不是VA及之前版本了,因为之前的根本没这个功能。可是他却说我那个是伪命题,自虐的话还是可以用JS,还说要拿我这帖当新手常犯错误的示例。
如果能让我这帖帮更多新手避免错误我是很开心,因为我搜索引擎搜到的问题也是别的新手问了他们不懂的地方,我才能剩下很多直接去学习JS的麻烦。但是综合这几句话来看却未免让人有些不舒服。我明明是新手也说要拿它当新手示例,却要我知道只有老手才知道的可以在RUBY里使用JS吗?以我一个新手的角度来说,按F12敲代码是MV/MZ的特性,已经很足以说明我用的是什么版本了才对。)

回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1830
在线时间
314 小时
注册时间
2021-11-7
帖子
165
8
发表于 2021-12-28 19:09:28 | 只看该作者
本帖最后由 夏虫沉默 于 2021-12-28 19:15 编辑
新耀012478 发表于 2021-12-28 18:08
我是看四楼和网络上搜到的内容的,它们说这个叫异步,然后网上说JS里异步的代码必然发生在同步代码之后, ...


同步,异步执行顺序可以参考下这篇文章,异步代码比同步代码慢的话,可以把之前的事件1第3行修改为
JAVASCRIPT 代码复制
  1. setTimeout(()=>{console.log($gameVariables.value(15))},0);//0延迟后打印变量15的值
套一层setTimeout把同步的部分也改为异步代码,打印结果就变成3了。
顺便说一句,对学习只要能够达到正常可以使用的地步,有时候也不用治经为博士

点评

我试着写了一下它没划return,倒是我注册按钮函数,我本来是分两行先给个名字的,我回帖并起来了它居然划掉了keycode,可是正常能用……真奇怪……  发表于 2021-12-29 00:20
啊原来在同一楼层点评就会收到回复了啊……这个跟贴吧倒不一样。  发表于 2021-12-29 00:18
我是把第3行设置成异步了,第4行它return它的,我异步我的,我没试过把return放异步里,理论上应该不行。  发表于 2021-12-29 00:12
没想到setTimeout可以用return啊!我之前在网上找的那些,我输入return的时候它自动划了一个删除线上去,我就以为setTimeout也不行了……多谢纠正!  发表于 2021-12-29 00:02
欲速春风山劝阻,不得恰恰不得呼。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-27 12:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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