设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1687|回复: 10
打印 上一主题 下一主题

[已经过期] 请大神看一下,有个问题我搞不懂

[复制链接]

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
跳转到指定楼层
1
发表于 2016-8-23 17:06:13 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
在Interpreter中,为什么我把“p @list”放在方法execute_command的首行,P的时候出现3次就停止了?不是无限次执行的吗?

Lv1.梦旅人

梦石
0
星屑
76
在线时间
1379 小时
注册时间
2012-7-5
帖子
1698

开拓者

2
发表于 2016-8-23 18:04:18 | 只看该作者
因为三次后没有任何事件在执行
我们来看一下简化的 Intepreter 执行逻辑(仅抽出与本题相关的)

点评

中断return的执行:如果A成立,执行B;但是,如果C成立,则不执行B,转而执行其他  发表于 2016-8-24 23:02
中断return的执行是什么鬼???????????????????????????????????????????????????????  发表于 2016-8-24 21:57
不知道为什么,默认脚本在execute_commond的方法体外,只执行了3次.我就这个问题搞不清  发表于 2016-8-24 16:53
但是,在execute_commond的方法体中,@index只执行到2,可是在execute_commond的方法体外,是不停的执行的;这个思路不符合默认脚本的设置  发表于 2016-8-24 16:52
执行后,继续执行execute_commond——这个反复执行,每执行一次,@index加1,当加到2的时候,结束程序。  发表于 2016-8-24 16:50

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 所以到底解决没有

查看全部评分


  -fk: -azogi:
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4169
在线时间
258 小时
注册时间
2013-10-13
帖子
815
3
 楼主| 发表于 2016-8-24 16:54:19 | 只看该作者
顶起
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
280
在线时间
1374 小时
注册时间
2005-10-16
帖子
5113

贵宾

4
发表于 2016-8-25 09:25:06 | 只看该作者
  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的运作有很大的帮助。

点评

可以在各个判断的if代码里加一下p命令做断点——我这几天也是这样想的,就去试试!  发表于 2016-8-25 22:58

评分

参与人数 1星屑 +90 收起 理由
RyanBern + 90 p函数调试大法好

查看全部评分

我只个搬答案的
叔叔我已经当爹了~
婚后闪人了……
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-30 10:12

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表