查看: 4173|回复: 20

[已经解决] 求问怎么判断是否在对话中

[复制链接]
梦石
0
星屑
328
在线时间
84 小时
注册时间
2018-3-30
回帖
6
发表于 2021-11-14 22:08:59 | 显示全部楼层 |阅读模式

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

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

×
就比如判断是否在对话中,如果是在对话,就打开某个开关或者调整某个数值之类的,对话结束就自动关闭开关,论坛里搜索了一下好像只看到有人问XP的,但没有看到VA的怎么解决_(:з」∠)_
梦石
0
星屑
328
在线时间
84 小时
注册时间
2018-3-30
回帖
6
 楼主| 发表于 2021-11-15 20:43:55 | 显示全部楼层
辛苦大佬们了!!问题解决了!太谢谢了!
回复

使用道具 举报

梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
回帖
1175
发表于 2021-11-15 07:25:16 | 显示全部楼层
你们ruby的大佬就是多
回复

使用道具 举报

梦石
0
星屑
17119
在线时间
6062 小时
注册时间
2011-7-18
回帖
153

开拓者

发表于 2021-11-15 01:11:35 | 显示全部楼层
本帖最后由 gqxastg 于 2021-11-15 16:34 编辑

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

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

而对于后者,详见:https://rpg.blue/thread-481754-1-1.html
简言之,因为不明设计原因,事件每次执行前默认会wait_for_message,导致当对话显示时,并行处理的事件会卡在这个等待中,而无法开始新一轮的执行

所以正确解法是:
按照上述链接里的帖子所写的,脚本新开一页插入
[pre lang="ruby"]class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 执行
  #--------------------------------------------------------------------------
  def run
    #wait_for_message
    while @list[@index] do
      execute_command
      @index += 1
    end
    Fiber.yield
    @fiber = nil
  end
end
[/pre](注意:因为这段代码是覆盖性操作,请尽量放在其他外来脚本的上方)
然后在并行处理的事件里
1.png
如图,像这样判断即可

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

↓ 感谢鹰大补充。那个帖子里这样做的目的是跳过结束部分,而这里主要是为了跳过开始部分。当然在这里也能享受到同样的好处(指解决事件结束时会多等待1帧的问题)

点评

啊啊啊啊谢谢大佬!!成功了成功了!!  发表于 2021-11-15 20:42
关于循环和等待1帧的原理,具体可以见 https://rpg.blue/thread-406532-1-1.html  发表于 2021-11-15 08:53
大大你看10L的方法能行么???  发表于 2021-11-15 07:38

评分

参与人数 2星屑 +250 赞 +1 收起 理由
alexncf125 + 250 认可答案
hyrious + 1 认可答案

查看全部评分

这里岚风·雷,任饭、PM理性粉、UT/DR原作粉、(Trans)Furry自萌,半吊子技术一枚_(:з」∠)_    游戏制作交流工(liao)作(tian)室欢迎来玩!
【无偿/有偿】RGSS3(VA)脚本定制 + 合作招募/同好交友    修正Firefox/火狐浏览器的代码框复制问题(油猴脚本)
Click→←Click
回复 1 0

使用道具 举报

梦石
0
星屑
29956
在线时间
5736 小时
注册时间
2016-3-8
回帖
1655
发表于 2021-11-15 00:23:24 | 显示全部楼层
本帖最后由 alexncf125 于 2021-11-15 09:04 编辑


黑历史治标又治本的方案, 插入这段:
  1. class Window_Message < Window_Base
  2.   alias :old_open_and_wait :open_and_wait
  3.   def open_and_wait
  4.     $game_switches[2] = true
  5.     old_open_and_wait
  6.   end
  7.   alias :old_close_and_wait :close_and_wait
  8.   def close_and_wait
  9.     old_close_and_wait
  10.     $game_switches[2] = false
  11.   end
  12. end
复制代码

点评

仔细看了眼, 8L的走路跟我想的走路不太一样,,,  发表于 2021-11-15 09:04
我以为LZ只是想让8L左边的小人开始走路,,,  发表于 2021-11-15 09:01
这个只是多一个开关用来判断,但是当用到并行事件里时,和busy?作用一样,依然会被wait_for_message暂停并行事件执行  发表于 2021-11-15 08:55
回复

使用道具 举报

梦石
0
星屑
29956
在线时间
5736 小时
注册时间
2016-3-8
回帖
1655
发表于 2021-11-15 00:14:40 | 显示全部楼层
本帖最后由 alexncf125 于 2021-11-15 00:23 编辑

黑历史
於十五 发表于 2021-11-15 00:02
ORZ好像还是不行,两个我都试过了,但是都没有效果,如果起效的话左边的小人应该会开始走路的,我试过开 ...


治标不治本的方案, 插入这段:
  1. class Game_Interpreter
  2.   #--------------------------------------------------------------------------
  3.   # ● 等待显示信息
  4.   #--------------------------------------------------------------------------
  5.   alias :old_wait_for_message_old :wait_for_message
  6.   def wait_for_message
  7.     return if $game_message.busy?
  8.     old_wait_for_message_old
  9.   end
  10. end
复制代码
回复

使用道具 举报

梦石
0
星屑
328
在线时间
84 小时
注册时间
2018-3-30
回帖
6
 楼主| 发表于 2021-11-15 00:02:41 | 显示全部楼层
alexncf125 发表于 2021-11-14 23:36
$game_message.busy?
或者
$game_message.has_text?

ORZ好像还是不行,两个我都试过了,但是都没有效果,如果起效的话左边的小人应该会开始走路的,我试过开按钮开关可以触发 Snipaste_2021-11-14_23-59-56.jpg Snipaste_2021-11-15_00-00-10.jpg
回复

使用道具 举报

梦石
0
星屑
328
在线时间
84 小时
注册时间
2018-3-30
回帖
6
 楼主| 发表于 2021-11-14 23:47:46 | 显示全部楼层
alexncf125 发表于 2021-11-14 23:36
$game_message.busy?
或者
$game_message.has_text?

Snipaste_2021-11-14_23-45-16.jpg 好像报错了,不知道为啥,是我用错了么

点评

不用if, == true也可以不用加  发表于 2021-11-14 23:51
回复

使用道具 举报

梦石
0
星屑
328
在线时间
84 小时
注册时间
2018-3-30
回帖
6
 楼主| 发表于 2021-11-14 23:45:23 | 显示全部楼层
夏虫沉默 发表于 2021-11-14 23:04
Window_Message类底下有open_and_wait方法,重写该方法可能有用

_(:з」∠)_对不起我是个程序小白,不敢乱动这个
回复

使用道具 举报

梦石
0
星屑
29956
在线时间
5736 小时
注册时间
2016-3-8
回帖
1655
发表于 2021-11-14 23:36:37 | 显示全部楼层
本帖最后由 alexncf125 于 2021-11-15 00:24 编辑

黑历史$game_message.busy?
或者
$game_message.has_text?

busy?包括选项, 数值输入等的情形
has_text?单纯文本对话

[pre lang="ruby"]#--------------------------------------------------------------------------
  # ● 判定是否存在显示内容
  #--------------------------------------------------------------------------
  def has_text?
    @texts.size > 0
  end
  #--------------------------------------------------------------------------
  # ● 判定是否为选择模式
  #--------------------------------------------------------------------------
  def choice?
    @choices.size > 0
  end
  #--------------------------------------------------------------------------
  # ● 判定是否为数值输入模式
  #--------------------------------------------------------------------------
  def num_input?
    @num_input_variable_id > 0
  end
  #--------------------------------------------------------------------------
  # ● 判定是否为物品选择模式
  #--------------------------------------------------------------------------
  def item_choice?
    @item_choice_variable_id > 0
  end
  #--------------------------------------------------------------------------
  # ● 判定是否为繁忙状态
  #--------------------------------------------------------------------------
  def busy?
    has_text? || choice? || num_input? || item_choice?
  end[/pre]
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部