Project1

标题: 请大神看一下,有个问题我搞不懂 [打印本页]

作者: kvkv97    时间: 2016-8-23 17:06
标题: 请大神看一下,有个问题我搞不懂
在Interpreter中,为什么我把“p @list”放在方法execute_command的首行,P的时候出现3次就停止了?不是无限次执行的吗?
作者: kuerlulu    时间: 2016-8-23 18:04
因为三次后没有任何事件在执行
我们来看一下简化的 Intepreter 执行逻辑(仅抽出与本题相关的)

作者: kvkv97    时间: 2016-8-24 16:54
顶起
作者: 亿万星辰    时间: 2016-8-25 09:25
  1.   #--------------------------------------------------------------------------
  2.   # ● 刷新画面
  3.   #--------------------------------------------------------------------------
  4.   def update
  5.     # 初始化循环计数
  6.     @loop_count = 0
  7.     # 循环
  8.     loop do
  9.       # 循环计数加 1
  10.       @loop_count += 1
  11.       # 如果执行了 100 个事件指令
  12.       if @loop_count > 100
  13.         # 为了防止系统崩溃、调用 Graphics.update
  14.         Graphics.update
  15.         @loop_count = 0
  16.       end
  17.       # 如果地图与事件启动有差异
  18.       if $game_map.map_id != @map_id
  19.         # 事件 ID 设置为 0
  20.         @event_id = 0
  21.       end
  22.       # 子注释器存在的情况下
  23.       if @child_interpreter != nil
  24.         # 刷新子注释器
  25.         @child_interpreter.update
  26.         # 子注释器执行结束的情况下
  27.         unless @child_interpreter.running?
  28.           # 删除字注释器
  29.           @child_interpreter = nil
  30.         end
  31.         # 如果子注释器还存在
  32.         if @child_interpreter != nil
  33.           return
  34.         end
  35.       end
  36.       # 信息结束待机的情况下
  37.       if @message_waiting
  38.         return
  39.       end
  40.       # 移动结束待机的情况下
  41.       if @move_route_waiting
  42.         # 强制主角移动路线的情况下
  43.         if $game_player.move_route_forcing
  44.           return
  45.         end
  46.         # 循环 (地图事件)
  47.         for event in $game_map.events.values
  48.           # 本事件为强制移动路线的情况下
  49.           if event.move_route_forcing
  50.             return
  51.           end
  52.         end
  53.         # 清除移动结束待机中的标志
  54.         @move_route_waiting = false
  55.       end
  56.       # 输入按钮待机中的情况下
  57.       if @button_input_variable_id > 0
  58.         # 执行按钮输入处理
  59.         input_button
  60.         return
  61.       end
  62.       # 等待中的情况下
  63.       if @wait_count > 0
  64.         # 减少等待计数
  65.         @wait_count -= 1
  66.         return
  67.       end
  68.       # 如果被强制行动的战斗者存在
  69.       if $game_temp.forcing_battler != nil
  70.         return
  71.       end
  72.       # 如果各画面的调用标志已经被设置
  73.       if $game_temp.battle_calling or
  74.          $game_temp.shop_calling or
  75.          $game_temp.name_calling or
  76.          $game_temp.menu_calling or
  77.          $game_temp.save_calling or
  78.          $game_temp.gameover
  79.         return
  80.       end
  81.       # 执行内容列表为空的情况下
  82.       if @list == nil
  83.         # 主地图事件的情况下
  84.         if @main
  85.           # 设置启动中的事件
  86.           setup_starting_event
  87.         end
  88.         # 什么都没有设置的情况下
  89.         if @list == nil
  90.           return
  91.         end
  92.       end
  93.       # 尝试执行事件列表、返回值为 false 的情况下
  94.       if execute_command == false
  95.         return
  96.       end
  97.       # 推进索引
  98.       @index += 1
  99.     end
  100.   end
复制代码

这是Interpreter的update方法,只有下面这里要调用execute_command这个方法
  1.       # 尝试执行事件列表、返回值为 false 的情况下
  2.       if execute_command == false
复制代码

虽然整个这部分是包含在一个loop do循环中的,但是你可以看到前面还有很多的条件在满足时会执行return。
所以如果你愿意的话,可以在各个判断的if代码里加一下p命令做断点,看看究竟是什么情况下会去执行某个return,这样我觉得会对你理解整个Interpreter的运作有很大的帮助。




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