Project1
标题:
请大神看一下,有个问题我搞不懂
[打印本页]
作者:
kvkv97
时间:
2016-8-23 17:06
标题:
请大神看一下,有个问题我搞不懂
在Interpreter中,为什么我把“p @list”放在方法execute_command的首行,P的时候出现3次就停止了?不是无限次执行的吗?
作者:
kuerlulu
时间:
2016-8-23 18:04
因为三次后没有任何事件在执行
我们来看一下简化的 Intepreter 执行逻辑(仅抽出与本题相关的)
0.png
(80.68 KB, 下载次数: 16)
下载附件
保存到相册
2016-8-23 18:04 上传
作者:
kvkv97
时间:
2016-8-24 16:54
顶起
作者:
亿万星辰
时间:
2016-8-25 09:25
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 初始化循环计数
@loop_count = 0
# 循环
loop do
# 循环计数加 1
@loop_count += 1
# 如果执行了 100 个事件指令
if @loop_count > 100
# 为了防止系统崩溃、调用 Graphics.update
Graphics.update
@loop_count = 0
end
# 如果地图与事件启动有差异
if $game_map.map_id != @map_id
# 事件 ID 设置为 0
@event_id = 0
end
# 子注释器存在的情况下
if @child_interpreter != nil
# 刷新子注释器
@child_interpreter.update
# 子注释器执行结束的情况下
unless @child_interpreter.running?
# 删除字注释器
@child_interpreter = nil
end
# 如果子注释器还存在
if @child_interpreter != nil
return
end
end
# 信息结束待机的情况下
if @message_waiting
return
end
# 移动结束待机的情况下
if @move_route_waiting
# 强制主角移动路线的情况下
if $game_player.move_route_forcing
return
end
# 循环 (地图事件)
for event in $game_map.events.values
# 本事件为强制移动路线的情况下
if event.move_route_forcing
return
end
end
# 清除移动结束待机中的标志
@move_route_waiting = false
end
# 输入按钮待机中的情况下
if @button_input_variable_id > 0
# 执行按钮输入处理
input_button
return
end
# 等待中的情况下
if @wait_count > 0
# 减少等待计数
@wait_count -= 1
return
end
# 如果被强制行动的战斗者存在
if $game_temp.forcing_battler != nil
return
end
# 如果各画面的调用标志已经被设置
if $game_temp.battle_calling or
$game_temp.shop_calling or
$game_temp.name_calling or
$game_temp.menu_calling or
$game_temp.save_calling or
$game_temp.gameover
return
end
# 执行内容列表为空的情况下
if @list == nil
# 主地图事件的情况下
if @main
# 设置启动中的事件
setup_starting_event
end
# 什么都没有设置的情况下
if @list == nil
return
end
end
# 尝试执行事件列表、返回值为 false 的情况下
if execute_command == false
return
end
# 推进索引
@index += 1
end
end
复制代码
这是Interpreter的update方法,只有下面这里要调用execute_command这个方法
# 尝试执行事件列表、返回值为 false 的情况下
if execute_command == false
复制代码
虽然整个这部分是包含在一个loop do循环中的,但是你可以看到前面还有很多的条件在满足时会执行return。
所以如果你愿意的话,可以在各个判断的if代码里加一下p命令做断点,看看究竟是什么情况下会去执行某个return,这样我觉得会对你理解整个Interpreter的运作有很大的帮助。
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1