本帖最后由 gqxastg 于 2021-11-15 16:34 编辑
首先需要清楚的是,在这里涉及的有“判断是否在对话中”和“并行处理的事件在对话中不能执行”两个问题
对于前者,使用进行判断是正确的,官方在事件解释器的wait_for_message(等待显示对话)中就是这样处理的
而对于后者,详见:https://rpg.blue/thread-481754-1-1.html
简言之,因为不明设计原因,事件每次执行前默认会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
(注意:因为这段代码是覆盖性操作,请尽量放在其他外来脚本的上方)
然后在并行处理的事件里
如图,像这样判断即可
或者如果你不想污染默认脚本,也可以:
在并行处理的事件里
如图,像这样操作即可,无须插入其他脚本
(注意:循环和等待1帧是必要的,如需执行其他事件指令需要放在这两个之间。当然了,如果你有需要读取第一行注释的脚本,可以把注释指令放在循环上面)
原理是既然事件只有每次执行前才会wait_for_message,那么就套一层循环,来让事件永远不结束,也就不会再经过新一轮执行的步骤了
↓ 感谢鹰大补充。那个帖子里这样做的目的是跳过结束部分,而这里主要是为了跳过开始部分。当然在这里也能享受到同样的好处(指解决事件结束时会多等待1帧的问题) |