Project1

标题: 求问怎么判断是否在对话中 [打印本页]

作者: 於十五    时间: 2021-11-14 22:08
标题: 求问怎么判断是否在对话中
就比如判断是否在对话中,如果是在对话,就打开某个开关或者调整某个数值之类的,对话结束就自动关闭开关,论坛里搜索了一下好像只看到有人问XP的,但没有看到VA的怎么解决_(:з」∠)_
作者: 任小雪    时间: 2021-11-14 22:34
对话前开个开关,
对话事件用并行,对话事件要该开关开了才运行
控制开关的用另一个并行事件
(临时想到,不懂和有错别找我)
作者: 於十五    时间: 2021-11-14 22:42
任小雪 发表于 2021-11-14 22:34
对话前开个开关,
对话事件用并行,对话事件要该开关开了才运行
控制开关的用另一个并行事件

不是这个意思,我是打算用在公共事件里和游戏同时并行处理的,每次对话都加一个开关真的太麻烦了,还可能漏加
其实我想的是,有没有在分支条件里填入某种脚本代码,就能直接判断是否在对话了并进行后续处理了
作者: 夏虫沉默    时间: 2021-11-14 23:04
Window_Message类底下有open_and_wait方法,重写该方法可能有用

2021-11-14_230440.jpg (123.03 KB, 下载次数: 25)

2021-11-14_230440.jpg

作者: alexncf125    时间: 2021-11-14 23:36
本帖最后由 alexncf125 于 2021-11-15 00:24 编辑
黑历史

作者: 於十五    时间: 2021-11-14 23:45
夏虫沉默 发表于 2021-11-14 23:04
Window_Message类底下有open_and_wait方法,重写该方法可能有用

_(:з」∠)_对不起我是个程序小白,不敢乱动这个
作者: 於十五    时间: 2021-11-14 23:47
alexncf125 发表于 2021-11-14 23:36
$game_message.busy?
或者
$game_message.has_text?

好像报错了,不知道为啥,是我用错了么
作者: 於十五    时间: 2021-11-15 00:02
alexncf125 发表于 2021-11-14 23:36
$game_message.busy?
或者
$game_message.has_text?

ORZ好像还是不行,两个我都试过了,但是都没有效果,如果起效的话左边的小人应该会开始走路的,我试过开按钮开关可以触发
作者: alexncf125    时间: 2021-11-15 00:14
本帖最后由 alexncf125 于 2021-11-15 00:23 编辑
黑历史

作者: alexncf125    时间: 2021-11-15 00:23
本帖最后由 alexncf125 于 2021-11-15 09:04 编辑

黑历史

作者: gqxastg    时间: 2021-11-15 01:11
本帖最后由 gqxastg 于 2021-11-15 16:34 编辑

首先需要清楚的是,在这里涉及的有“判断是否在对话中”和“并行处理的事件在对话中不能执行”两个问题

对于前者,使用
  1. $game_message.busy?
复制代码
进行判断是正确的,官方在事件解释器的wait_for_message(等待显示对话)中就是这样处理的

而对于后者,详见:https://rpg.blue/thread-481754-1-1.html
简言之,因为不明设计原因,事件每次执行前默认会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
(注意:因为这段代码是覆盖性操作,请尽量放在其他外来脚本的上方)
然后在并行处理的事件里

如图,像这样判断即可

或者如果你不想污染默认脚本,也可以:
在并行处理的事件里

如图,像这样操作即可,无须插入其他脚本
(注意:循环和等待1帧是必要的,如需执行其他事件指令需要放在这两个之间。当然了,如果你有需要读取第一行注释的脚本,可以把注释指令放在循环上面)
原理是既然事件只有每次执行前才会wait_for_message,那么就套一层循环,来让事件永远不结束,也就不会再经过新一轮执行的步骤了

↓ 感谢鹰大补充。那个帖子里这样做的目的是跳过结束部分,而这里主要是为了跳过开始部分。当然在这里也能享受到同样的好处(指解决事件结束时会多等待1帧的问题)
作者: 任小雪    时间: 2021-11-15 07:25
你们ruby的大佬就是多
作者: 於十五    时间: 2021-11-15 20:43
辛苦大佬们了!!问题解决了!太谢谢了!




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