Project1

标题: 对话框与并行事件的奇妙纠葛( [打印本页]

作者: 百里_飞柳    时间: 2020-5-14 08:52
标题: 对话框与并行事件的奇妙纠葛(
本帖最后由 百里_飞柳 于 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 方法,因此如果并行事件中还是有显示对话的话,它依然会等待对话框关闭再继续执行、显示它的对话。

如果你不想污染默认的脚本,可以在最下面的插件脚本处新增以下的覆盖脚本,并命名为 对话框不再阻止并行事件
当然请先确保没有使用任何修改了事件解释器类的插件。
RUBY 代码复制
  1. class Game_Interpreter
  2.   #--------------------------------------------------------------------------
  3.   # ● 执行
  4.   #--------------------------------------------------------------------------
  5.   def run
  6.     #wait_for_message
  7.     while @list[@index] do
  8.       execute_command
  9.       @index += 1
  10.     end
  11.     Fiber.yield
  12.     @fiber = nil
  13.   end
  14. end


作者: whitedewxiao    时间: 2020-5-14 09:21
老鹰出品,必属精品
作者: Arfies    时间: 2020-5-15 20:31
感谢老鹰分享~!
不用03换VA做文字游戏相关就总有各种莫名其妙的对话框问题1551
作者: a7466666    时间: 2020-8-9 19:30
涨知识了
作者: 3026891692    时间: 2021-2-27 00:12
阿巴阿巴阿巴(吃瓜群众)




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