Project1

标题: [事件脚本党注意]请留心脚本事件执行的返回值问题 [打印本页]

作者: SailCat    时间: 2012-3-18 16:30
标题: [事件脚本党注意]请留心脚本事件执行的返回值问题
最近在设置一个战斗事件
大概是这样的:有一个敌人,当HP降到0时,变身为另外一个敌人,就这么简单的一个需求
因为HP降到0时会优先进行战斗不能的判定,所以我设置了该敌人的“不死之身”属性,但变身后这个属性就没用了(变身后的敌人,设定是可以打死的)
所以在战斗事件的[敌人变身]之后,我附加了一条事件脚本:$game_troop.enemies[0].immortal = false

结果每次执行到这里,敌人变完身就会卡机。百思不得其解。去掉事件脚本,就没问题了
后来追踪了RM的Interpreter,发现事件指令的执行一般有2个返回值:false和true
返回true,则跳到下一条指令进行解释执行
返回false,则指针不往下移动,一般是用于像场所移动啦,渐变啦,战斗处理啦这种一时半会没法儿结束的事件

于是发现这个问题的所在:$game_troop.enemies[0].immortal=false的执行会返回前面被赋值的变量的值,也就是false
对于事件指令355,执行的方式是return eval(parameters[0]),就把这个false返回给解释器了
问题迎刃而解:
$game_troop.enemies[0].immortal = false
return true
调试成功。

提醒事件脚本党,在书写事件的时候,特别是最后一行执行和false相关的赋值时,一定要加一句return true
同样,如果通过脚本来模拟执行场所移动什么的,最后加一句return false以免事件漏下去了

作者: IamI    时间: 2012-3-18 18:56
false和 nil 都是伪值,造成的 BUG 诚如楼主所说。不过这个比较明显,像下面这种就真的很难看出来了
事件脚本:
run
script:
def run
$a=false
end
甚至
def run
s="a"
s[/b/]
end
都会触发,
很多情况下在几个 end 互套的时候更加隐蔽。

另建议:直接在最后写 0 或 true 即可,return 可省
作者: pigsss    时间: 2012-3-18 23:32
VA每个方法都会默认返回在最后end之前的值 = = ,虽说方便省略return,但也会带来bug。
作者: 叶子    时间: 2012-3-23 01:12
本帖最后由 叶子 于 2012-3-23 01:23 编辑

【XP】其实利用事件脚本最后返回值是false,下一帧事件解释器再次执行这条指令的机制,能实现类似不断调用update的效果。作用?把本来要新建一个scene的东西放到事件中实现。╱/(◕‿‿◕)\╲
【VA】事件脚本没有返回值真伪的问题,事件解释器一定会继续执行下一条指令。不过由于事件解释器是在一个纤程中,事件脚本利用Fiber.yield可以暂停纤程,下一帧自动继续(解释器每帧调用resume)
作者: LOVE丶莫颜    时间: 2012-5-13 22:44
会给其他脚本带来冲突的吧?表示我的事件党,对脚本不是很懂。
作者: 精灵使者    时间: 2012-5-21 22:36
所以精灵果断的在事件脚本前后插入等待帧……
作者: 冲啊小笼包    时间: 2012-5-22 18:08
能不能这么做呢?就是设置敌人最底血降为1(这个设置的方法貌似用事件或状态就行)然后可以设置一个事件,当XXX怪血=1时,立刻转换成为其他怪物,我没时间慢慢研究,记得是行的,LZ可以试试,不行的话无视好了!




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