加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 百里_飞柳 于 2020-5-14 09:34 编辑
此帖为对RGSS3中并行事件被对话框暂停的探讨,欢迎大家阅读讨论。
首先,你写了一个非常简单的 玩家按键触发 的NPC,
其中指令如下图,是一个非常常见的含有一句对话的那种。
然后,你想要一些别的东西,比如在当前地图上时一直有个烦人精隔一段时间就叨叨逼逼一下,
便新增了如下图指令的 并行事件,其中1号变量在计数,每次显示一次就自加 1。
于是当在地图上行动时,就是这样的效果:
每在地图上空闲着1s,这个烦人精就开始逼逼,按掉后变量自加1,1s后他又来逼逼了。
然后你赶紧去找NPC搭个话
好了,现在烦人精没法逼逼了,因为对话框被占用了,他必须等到这边对话完成才能继续逼逼。
当然你很快就觉得这种时不时就自动触发的对话真的太烦人了,
于是你想改掉,换成比如随着计时而画面变色等其他特效,
之前的并行执行的事件此时变成了这样:
当然我没有加这些特效,简单点,讲话的方式简单点。
现在你进行测试。
当玩家在地图上行走时,一切正常。
但是!当玩家与NPC对话时,并行事件在执行完当前内容后,居然没有继续执行,而是被暂停了!!
明明并行事件里没有对话,为啥它还会被暂停?
这个就牵扯到了RGSS3里的一个设计思想:想尽可能确保事件能同步执行。
这从脚本中可以找到答案:
在事件的执行时,额外调用了一个 wait_for_message 方法,也就是它,阻碍了事件的再次执行。
尽管并行事件与普通执行的事件各自有一个事件解释器,它们各自执行,互不打扰,
但是在地图上时,对话框只有一个,大家都是用这一个。
因此当对话框在显示时,任何一个事件解释器的 wait_for_message 指令都会被触发,并等待直至对话框关闭。
那这个设计到底有没有意义呢?
我 也 不 知 道 呢 ~
但是这可不行,明明应该是独立的并行事件,怎么能因为对话框而停下来呢?不要停下来啊!计数的!
把 run 方法中的 wait_for_message 注释掉后,再来试试:
现在完美啦!
PS:因为显示文本指令里已经自带了 wait_for_message 方法,因此如果并行事件中还是有显示对话的话,它依然会等待对话框关闭再继续执行、显示它的对话。
如果你不想污染默认的脚本,可以在最下面的插件脚本处新增以下的覆盖脚本,并命名为 对话框不再阻止并行事件
当然请先确保没有使用任何修改了事件解释器类的插件。
class Game_Interpreter #-------------------------------------------------------------------------- # ● 执行 #-------------------------------------------------------------------------- def run #wait_for_message while @list[@index] do execute_command @index += 1 end Fiber.yield @fiber = nil end end
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 执行
#--------------------------------------------------------------------------
def run
#wait_for_message
while @list[@index] do
execute_command
@index += 1
end
Fiber.yield
@fiber = nil
end
end
|