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

Project1

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

[讨论] [事件脚本党注意]请留心脚本事件执行的返回值问题

[复制链接]

Lv5.捕梦者 (版主)

遠航の猫咪

梦石
3
星屑
23191
在线时间
2387 小时
注册时间
2005-10-15
帖子
1166

开拓者

跳转到指定楼层
1
发表于 2012-3-18 16:30:10 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
最近在设置一个战斗事件
大概是这样的:有一个敌人,当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以免事件漏下去了
SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。

Lv1.梦旅人

萌萌的小笼包

梦石
0
星屑
50
在线时间
193 小时
注册时间
2012-4-30
帖子
652
7
发表于 2012-5-22 18:08:08 | 只看该作者
能不能这么做呢?就是设置敌人最底血降为1(这个设置的方法貌似用事件或状态就行)然后可以设置一个事件,当XXX怪血=1时,立刻转换成为其他怪物,我没时间慢慢研究,记得是行的,LZ可以试试,不行的话无视好了!

点评

我记得应该有设置,就是比如说还有400HP,造成伤害大于最后的剩余HP后,不管怎么样都为1  发表于 2012-5-23 17:42
被打成1血很困难的 亲……  发表于 2012-5-23 09:24
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

6
发表于 2012-5-21 22:36:53 | 只看该作者
所以精灵果断的在事件脚本前后插入等待帧……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
49
在线时间
186 小时
注册时间
2012-5-8
帖子
987
5
发表于 2012-5-13 22:44:52 | 只看该作者
会给其他脚本带来冲突的吧?表示我的事件党,对脚本不是很懂。
看什么看,没看过大坑啊!
-------------------------炫翼-----------------------------
剧情:4%
地图:2%
系统:7%
优化:3%
脚本:25%
--------------------------炫翼----------------------------

      工作室


广告位招租....  
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
4
发表于 2012-3-23 01:12:44 | 只看该作者
本帖最后由 叶子 于 2012-3-23 01:23 编辑

【XP】其实利用事件脚本最后返回值是false,下一帧事件解释器再次执行这条指令的机制,能实现类似不断调用update的效果。作用?把本来要新建一个scene的东西放到事件中实现。╱/(◕‿‿◕)\╲
【VA】事件脚本没有返回值真伪的问题,事件解释器一定会继续执行下一条指令。不过由于事件解释器是在一个纤程中,事件脚本利用Fiber.yield可以暂停纤程,下一帧自动继续(解释器每帧调用resume)

点评

嗯,算半个吧  发表于 2012-4-11 17:24
哇,原来XP自带事件用协程……  发表于 2012-4-11 11:37
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1641
在线时间
2205 小时
注册时间
2010-6-27
帖子
1299
3
发表于 2012-3-18 23:32:06 | 只看该作者
VA每个方法都会默认返回在最后end之前的值 = = ,虽说方便省略return,但也会带来bug。

点评

是啊……= =  发表于 2012-3-19 09:30
这明明是ruby的特性吧喂= =  发表于 2012-3-19 08:43

于是我也广告下…
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

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

另建议:直接在最后写 0 或 true 即可,return 可省
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 20:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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