Project1

标题: 请问这段脚本怎么会出问题了啊?求解 [打印本页]

作者: 梦幻之旅    时间: 2012-4-26 17:58
标题: 请问这段脚本怎么会出问题了啊?求解
  1. /pre #==============================================================================
  2. # ■ Interpreter (分割定义 1)
  3. #------------------------------------------------------------------------------
  4. #  执行事件命令的解释器。本类在 Game_System 类
  5. # 与 Game_Event 类的内部使用。
  6. #==============================================================================

  7. class Interpreter
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化标志
  10.   #     depth : 事件的深度
  11.   #     main  : 主标志
  12.   #--------------------------------------------------------------------------
  13.   def initialize(depth = 0, main = false)
  14.     @depth = depth
  15.     @main = main
  16.     # 深度超过 100 级
  17.     if depth > 100
  18.       print("调用公用事件超过了限制。")
  19.       exit
  20.     end
  21.     # 清除注释器的内部状态
  22.     clear
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 清除
  26.   #--------------------------------------------------------------------------
  27.   def clear
  28.     @map_id = 0                       # 启动时的地图 ID
  29.     @event_id = 0                     # 事件 ID
  30.     @message_waiting = false          # 信息结束后待机中
  31.     @move_route_waiting = false       # 移动结束后待机中
  32.     @button_input_variable_id = 0     # 输入按钮 变量 ID
  33.     @wait_count = 0                   # 窗口计数
  34.     @child_interpreter = nil          # 子实例
  35.     @branch = {}                      # 分支数据
  36.   end
  37.   #--------------------------------------------------------------------------
  38.   # ● 设置事件
  39.   #     list     : 执行内容
  40.   #     event_id : 事件 ID
  41.   #--------------------------------------------------------------------------
  42.   def setup(list, event_id)
  43.     # 清除注释器的内部状态
  44.     clear
  45.     # 记忆地图 ID
  46.     @map_id = $game_map.map_id
  47.     # 记忆事件 ID
  48.     @event_id = event_id
  49.     # 记忆执行内容
  50.     @list = list
  51.     # 初始化索引
  52.     @index = 0
  53.     # 清除分支数据用复述
  54.     @branch.clear
  55.   end
  56.   #--------------------------------------------------------------------------
  57.   # ● 执行中判定
  58.   #--------------------------------------------------------------------------
  59.   def running?
  60.     return @list != nil
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   # ● 设置启动中事件
  64.   #--------------------------------------------------------------------------
  65.   def setup_starting_event
  66.     # 刷新必要的地图
  67.     if $game_map.need_refresh
  68.       $game_map.refresh
  69.     end
  70.     # 如果调用的公共事件被预约的情况下
  71.      if $game_temp.common_event_id > 0
  72.       # 设置事件
  73.       setup($data_common_events[$game_temp.common_event_id].list, 0)
  74.       # 解除预约
  75.       $game_temp.common_event_id = 0
  76.       return
  77.     end
  78.     # 循环 (地图事件)
  79.     for event in $game_map.events.values
  80.       # 如果找到了启动中的事件
  81.       if event.starting
  82.         # 如果不是自动执行
  83.         if event.trigger < 3
  84.           # 清除启动中标志
  85.           event.clear_starting
  86.           # 锁定
  87.           event.lock
  88.         end
  89.         # 设置事件
  90.         setup(event.list, event.id)
  91.         return
  92.       end
  93.     end
  94.     # 循环(公共事件)
  95.     for common_event in $data_common_events.compact
  96.       # 目标的自动执行开关为 ON 的情况下
  97.       if common_event.trigger == 1 and
  98.          $game_switches[common_event.switch_id] == true
  99.         # 设置事件
  100.         setup(common_event.list, 0)
  101.         return
  102.       end
  103.     end
  104.   end
  105.   #--------------------------------------------------------------------------
  106.   # ● 刷新画面
  107.   #--------------------------------------------------------------------------
  108.   def update
  109.     # 初始化循环计数
  110.     @loop_count = 0
  111.     # 循环
  112.     loop do
  113.       # 循环计数加 1
  114.       @loop_count += 1
  115.       # 如果执行了 100 个事件指令
  116.       if @loop_count > 100
  117.         # 为了防止系统崩溃、调用 Graphics.update
  118.         Graphics.update
  119.         @loop_count = 0
  120.       end
  121.       # 如果地图与事件启动有差异
  122.       if $game_map.map_id != @map_id
  123.         # 事件 ID 设置为 0
  124.         @event_id = 0
  125.       end
  126.       # 子注释器存在的情况下
  127.       if @child_interpreter != nil
  128.         # 刷新子注释器
  129.         @child_interpreter.update
  130.         # 子注释器执行结束的情况下
  131.         unless @child_interpreter.running?
  132.           # 删除字注释器
  133.           @child_interpreter = nil
  134.         end
  135.         # 如果子注释器还存在
  136.         if @child_interpreter != nil
  137.           return
  138.         end
  139.       end
  140.       # 信息结束待机的情况下
  141.       if @message_waiting
  142.         return
  143.       end
  144.       # 移动结束待机的情况下
  145.       if @move_route_waiting
  146.         # 强制主角移动路线的情况下
  147.         if $game_player.move_route_forcing
  148.           return
  149.         end
  150.         # 循环 (地图事件)
  151.         for event in $game_map.events.values
  152.           # 本事件为强制移动路线的情况下
  153.           if event.move_route_forcing
  154.             return
  155.           end
  156.         end
  157.         # 清除移动结束待机中的标志
  158.         @move_route_waiting = false
  159.       end
  160.       # 输入按钮待机中的情况下
  161.       if @button_input_variable_id > 0
  162.         # 执行按钮输入处理
  163.         input_button
  164.         return
  165.       end
  166.       # 等待中的情况下
  167.       if @wait_count > 0
  168.         # 减少等待计数
  169.         @wait_count -= 1
  170.         return
  171.       end
  172.       # 如果被强制行动的战斗者存在
  173.       if $game_temp.forcing_battler != nil
  174.         return
  175.       end
  176.       # 如果各画面的调用标志已经被设置
  177.       if $game_temp.battle_calling or
  178.          $game_temp.shop_calling or
  179.          $game_temp.name_calling or
  180.          $game_temp.menu_calling or
  181.          $game_temp.save_calling or
  182.          $game_temp.gameover
  183.         return
  184.       end
  185.       # 执行内容列表为空的情况下
  186.       if @list == nil
  187.         # 主地图事件的情况下
  188.         if @main
  189.           # 设置启动中的事件
  190.           setup_starting_event
  191.         end
  192.         # 什么都没有设置的情况下
  193.         if @list == nil
  194.           return
  195.         end
  196.       end
  197.       # 尝试执行事件列表、返回值为 false 的情况下
  198.       if execute_command == false
  199.         return
  200.       end
  201.       # 推进索引
  202.       @index += 1
  203.     end
  204.   end
  205.   #--------------------------------------------------------------------------
  206.   # ● 输入按钮
  207.   #--------------------------------------------------------------------------
  208.   def input_button
  209.     # 判定按下的按钮
  210.     n = 0
  211.     for i in 1..18
  212.       if Input.trigger?(i)
  213.         n = i
  214.       end
  215.     end
  216.     # 按下按钮的情况下
  217.     if n > 0
  218.       # 更改变量值
  219.       $game_variables[@button_input_variable_id] = n
  220.       $game_map.need_refresh = true
  221.       # 输入按键结束
  222.       @button_input_variable_id = 0
  223.     end
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ● 设置选择项
  227.   #--------------------------------------------------------------------------
  228.   def setup_choices(parameters)
  229.     # choice_max 为设置选择项的项目数
  230.     $game_temp.choice_max = parameters[0].size
  231.     # message_text 为设置选择项
  232.     for text in parameters[0]
  233.       $game_temp.message_text += text + "
  234. "
  235.     end
  236.     # 设置取消的情况的处理
  237.     $game_temp.choice_cancel_type = parameters[1]
  238.     # 返回调用设置
  239.     current_indent = @list[@index].indent
  240.     $game_temp.choice_proc = Proc.new { |n| @branch[current_indent] = n }
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # ● 角色用 itereta (考虑全体同伴)
  244.   #     parameter : 1 以上为 ID、0 为全体
  245.   #--------------------------------------------------------------------------
  246.   def iterate_actor(parameter)
  247.     # 全体同伴的情况下
  248.     if parameter == 0
  249.       # 同伴全体循环
  250.       for actor in $game_party.actors
  251.         # 评价块
  252.         yield actor
  253.       end
  254.     # 单体角色的情况下
  255.     else
  256.       # 获取角色
  257.       actor = $game_actors[parameter]
  258.       # 获取角色
  259.       yield actor if actor != nil
  260.     end
  261.   end
  262.   #--------------------------------------------------------------------------
  263.   # ● 敌人用 itereta (考虑队伍全体)
  264.   #     parameter : 0 为索引、-1 为全体
  265.   #--------------------------------------------------------------------------
  266.   def iterate_enemy(parameter)
  267.     # 队伍全体的情况下
  268.     if parameter == -1
  269.       # 队伍全体循环
  270.       for enemy in $game_troop.enemies
  271.         # 评价块
  272.         yield enemy
  273.       end
  274.     # 敌人单体的情况下
  275.     else
  276.       # 获取敌人
  277.       enemy = $game_troop.enemies[parameter]
  278.       # 评价块
  279.       yield enemy if enemy != nil
  280.     end
  281.   end
  282.   #--------------------------------------------------------------------------
  283.   # ● 战斗者用 itereta (要考虑全体队伍、全体同伴)
  284.   #     parameter1 : 0 为敌人、1 为角色
  285.   #     parameter2 : 0 以上为索引、-1 为全体
  286.   #--------------------------------------------------------------------------
  287.   def iterate_battler(parameter1, parameter2)
  288.     # 敌人的情况下
  289.     if parameter1 == 0
  290.       # 调用敌人的 itereta
  291.       iterate_enemy(parameter2) do |enemy|
  292.         yield enemy
  293.       end
  294.     # 角色的情况下
  295.     else
  296.       # 全体同伴的情况下
  297.       if parameter2 == -1
  298.         # 同伴全体循环
  299.         for actor in $game_party.actors
  300.           # 评价块
  301.           yield actor
  302.         end
  303.       # 角色单体 (N 个人) 的情况下
  304.       else
  305.         # 获取角色
  306.         actor = $game_party.actors[parameter2]
  307.         # 评价块
  308.         yield actor if actor != nil
  309.       end
  310.     end
  311.   end
  312. end
复制代码
72行加#的话最后一行end就出问题
[img]http://tieba.baidu.comfile:///D:/Program%20Files/Tencent/QQ2010/Users/1093639374/Image/Image1/EYYYF8[[0J%RXT@BV)4U$(9.jpg[/img]
http://imgsrc.baidu.com/forum/pi ... 5dde71191ef6da6.jpg


‘‘──梦幻之旅于2012-4-26 17:59补充以下内容

妈妈呀……谁来帮我……
’’


‘‘──梦幻之旅于2012-4-26 18:00补充以下内容


本人初来乍到不会用哈……
’’dsu_plus_rewardpost_czw
作者: garfeng    时间: 2012-4-26 18:14
因为每一个判断句都有一个if加一个end,你只去掉了if,78行那个end就多出来了,没有与之对应的关键词。导致对应出错。也#掉78行的end就行。
作者: 梦幻之旅    时间: 2012-4-26 18:55
garfeng 发表于 2012-4-26 18:14
因为每一个判断句都有一个if加一个end,你只去掉了if,78行那个end就多出来了,没有与之对应的关键词。导致 ...

但是end和if都#掉了以后74行又出问题了
作者: kangxi0109    时间: 2012-4-26 21:53
这应该是由于判定条件失效而发生执行混乱的错误...
作者: garfeng    时间: 2012-4-27 15:58
如楼上所说,     if $game_temp.common_event_id > 0这样一句不仅仅是条件,同时也定义了$game_temp.common_event_id 这个变量,从而那个.list才有定义,如果没有if语句,那么list就没有定义,所以会出错。
我不知道你为什么想把条件去掉,目的是什么呀?
但是很明显,去掉条件,连事件id都没有,又哪里来的id.list?






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