Project1

标题: 请教个战棋系统范围闪烁总是失败的问题 [打印本页]

作者: 无心孤云    时间: 2009-4-26 04:34
标题: 请教个战棋系统范围闪烁总是失败的问题
使用了http://rpg.blue/web/htm/news443.htm这里的这个叶子的SLG战棋系统教學(阿尔西斯战记0.5)里的战斗系统。。。也就是战棋模式的脚本
代入后在运行的时候总是出现个错误。。。。
想请教下这几行错误是啥意思呢。。。

在用移动指令的时候提示:
脚本'scene_SLG(指令回合)'的239行发生了NoMethodError.undefined method '[]=' fornil:NilClass
我查看了脚本,是下面这句错误。。。。
      @spriteset.tilemap.flash_data[grid.x, grid.y] = MOVE_COLOR
  1. class Scene_SLG
  2.   #==========================================================================
  3.   # ■ 战斗指令主流程
  4.   #==========================================================================
  5.   #--------------------------------------------------------------------------
  6.   # ◎开始战斗指令回合
  7.   #--------------------------------------------------------------------------
  8.   def start_phase4

  9.     # 转移到回合 4
  10.     @phase = 4
  11.     # 记录初始位置
  12.     @old_grid = Grid.new $game_map.events[@active_battler.event_id].x,    $game_map.events[@active_battler.event_id].y
  13.     @old_direction = $game_map.events[@active_battler.event_id].direction
  14.     @now_grid = Grid.new $game_map.events[@active_battler.event_id].x,    $game_map.events[@active_battler.event_id].y
  15.     # 光标移动(附带地图滚动)
  16.     $game_map.chaochaoc(@old_grid.x, @old_grid.y, 7)
  17.     # 设置已行动标志
  18.     @active_battler.have_moved = false
  19.     # 设置角色指令窗口
  20.     setup_command_window
  21.   end
  22.   #--------------------------------------------------------------------------
  23.   # ◎刷新
  24.   #--------------------------------------------------------------------------
  25.   def update_phase4
  26.   
  27.     # 记录现在位置
  28.     @now_grid.x = $game_map.events[@active_battler.event_id].x
  29.     @now_grid.y = $game_map.events[@active_battler.event_id].y
  30.     # 移动刷新
  31.     if @phase4_move_select
  32.       update_phase4_move_select
  33.       # 状态窗口刷新
  34.       update_status_window
  35.     # 物品选择刷新
  36.     elsif @phase4_item_select
  37.       update_phase4_item_select
  38.     # 特技选择刷新
  39.     elsif @phase4_skill_select
  40.       update_phase4_skill_select
  41.     # 目标选择刷新
  42.     elsif @phase4_target_select
  43.       update_phase4_target_select
  44.       # 状态窗口刷新
  45.       update_status_window
  46.     # 基本指令刷新
  47.     elsif @phase4_basic_command
  48.       update_phase4_basic_command
  49.     end
  50.   end
  51.   #--------------------------------------------------------------------------
  52.   # ◎刷新状态窗口
  53.   #--------------------------------------------------------------------------
  54.   def update_status_window
  55.     # 检查光标位置(避免重复刷新)
  56.     if $game_cursor.x == @status_x and $game_cursor.y == @status_y
  57.       return
  58.     end
  59.     @status_x = $game_cursor.x
  60.     @status_y = $game_cursor.y
  61.     if @battler_coordinate[@status_x,@status_y] != nil and
  62.       @battlers[@battler_coordinate[@status_x,@status_y]] != nil
  63.       # 死人不显示状态窗口
  64.       if @battlers[@battler_coordinate[@status_x,@status_y]].death == true
  65.         @slg_status_window.visible = false
  66.         return
  67.       end
  68.       # 刷新窗口
  69.       @slg_status_window.refresh @battlers[@battler_coordinate[@status_x,@status_y]]
  70.     else
  71.       @slg_status_window.visible = false
  72.     end
  73.   end
  74.   #==========================================================================
  75.   # ■ 角色指令窗口
  76.   #==========================================================================
  77.   #--------------------------------------------------------------------------
  78.   # ◎设置角色指令窗口
  79.   #--------------------------------------------------------------------------
  80.   def setup_command_window
  81.     # 角色指令窗口有效化
  82.     @actor_command_window.active = true
  83.     #@actor_command_window.visible = true
  84.     @phase4_basic_command = true
  85.     # 判断是否已行动过
  86.     if @active_battler.have_moved
  87.       @actor_command_window.disable_item(0)
  88.       # 设置索引为 1
  89.       @actor_command_window.index = 1
  90.     else
  91.       @actor_command_window.draw_item(0, Color.new(255,255,255))
  92.       # 设置索引为 0
  93.       @actor_command_window.index = 0
  94.       # 闪烁
  95.       $game_map.events[@active_battler.event_id].blink = true
  96.     end
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ◎关闭角色指令窗口
  100.   #--------------------------------------------------------------------------
  101.   def close_command_window
  102.     # 角色指令窗口无效化
  103.     @actor_command_window.active = false
  104.     @actor_command_window.visible = false
  105.     @phase4_basic_command = false
  106.     # 结束闪烁
  107.     $game_map.events[@active_battler.event_id].blink = false
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ◎角色指令窗口刷新
  111.   #--------------------------------------------------------------------------
  112.   def update_phase4_basic_command

  113.     # 事件移动
  114.     $game_map.events[@active_battler.event_id].move_type_custom
  115.     # 镜头跟随
  116.     if $game_map.events[@active_battler.event_id].moving?
  117.       max_x = ($game_map.width - 20) * 128
  118.       max_y = ($game_map.height - 15) * 128
  119.       $game_map.display_x = [0, [
  120.       $game_map.events[@active_battler.event_id].real_x - CENTER_X, max_x].min].max
  121.       $game_map.display_y = [0, [
  122.       $game_map.events[@active_battler.event_id].real_y - CENTER_Y, max_y].min].max
  123.     end
  124.     # 地图滚动或角色移动中就关闭窗口
  125.     if $game_map.scrolling? or $game_map.events[@active_battler.event_id].moving?
  126.       # 角色指令窗口无效化
  127.       @actor_command_window.active = false
  128.       @actor_command_window.visible = false
  129.       @command_need_refresh = true
  130.       return
  131.     elsif @command_need_refresh == true
  132.       # 角色指令窗口有效化
  133.       @actor_command_window.active = true
  134.       @command_need_refresh = false
  135.     end
  136.     # 窗口可视化
  137.     @actor_command_window.visible = true
  138.     # 按下 B 键的情况下
  139.     if Input.trigger?(Input::B)
  140.       # 演奏取消 SE
  141.       $game_system.se_play($data_system.cancel_se)
  142.       # 角色已移动过的话
  143.       if @active_battler.have_moved
  144.         $game_map.events[@active_battler.event_id].moveto(@old_grid.x, @old_grid.y)
  145.         $game_map.events[@active_battler.event_id].direction = @old_direction
  146.         # 地图滚动
  147.         $game_map.chaochaoc(@old_grid.x, @old_grid.y, 7)
  148.         @active_battler.have_moved = false
  149.         # 记录新位置
  150.         change_coordinate(@active_battler.event_id, @now_grid.x, @now_grid.y,
  151.         @old_grid.x, @old_grid.y)
  152.         # 刷新一遍窗口
  153.         setup_command_window
  154.       end
  155.       return
  156.     end
  157.     # 按下 C 键的情况下
  158.     if Input.trigger?(Input::C)
  159.       # 角色指令窗口光标位置分歧
  160.       case @actor_command_window.index
  161.       when 0  # 移动
  162.         # 移动过就不能再选
  163.         if @active_battler.have_moved
  164.           return
  165.         end
  166.         # 演奏确定 SE
  167.         $game_system.se_play($data_system.decision_se)
  168.         # 关闭角色指令窗口
  169.         close_command_window
  170.         # 开始选择移动位置
  171.         start_move_select
  172.       when 1  # 攻击
  173.         # 演奏确定 SE
  174.         $game_system.se_play($data_system.decision_se)
  175.         # 关闭角色指令窗口
  176.         close_command_window
  177.         # 设置行动
  178.         @active_battler.current_action.kind = 1
  179.         @skill = $data_skills[@active_battler.skill_of_attack]
  180.         @active_battler.current_action.skill_id = @skill.id
  181.         make_range_and_aoe(@skill)
  182.         # 效果范围是单体的情况下
  183.         if @skill.scope == 1 or @skill.scope == 3 or @skill.scope == 5
  184.           # 记录窗口
  185.           @ex_window = 0
  186.           # 开始选择目标
  187.           start_target_select
  188.         end
  189.       when 2  # 特技
  190.         # 演奏确定 SE
  191.         $game_system.se_play($data_system.decision_se)
  192.         # 关闭角色指令窗口
  193.         close_command_window
  194.         # 设置行动
  195.         @active_battler.current_action.kind = 1
  196.         # 开始选择特技
  197.         start_skill_select
  198.       when 3  # 物品
  199.         # 演奏确定 SE
  200.         $game_system.se_play($data_system.decision_se)
  201.         # 关闭角色指令窗口
  202.         close_command_window
  203.         # 设置行动
  204.         @active_battler.current_action.kind = 2
  205.         # 开始选择物品
  206.         start_item_select
  207.      when 4  # 休息
  208.         # 演奏确定 SE
  209.         $game_system.se_play($data_system.decision_se)
  210.         # 关闭角色指令窗口
  211.         close_command_window
  212.         # 设置行动
  213.         @active_battler.current_action.kind = 0
  214.         @active_battler.current_action.basic = 3
  215.         # 开始行动回合
  216.         start_phase5
  217.       end
  218.       return
  219.     end
  220.   end
  221.   #==========================================================================
  222.   # ■ 移动选择
  223.   #==========================================================================
  224.   #--------------------------------------------------------------------------
  225.   # ◎开始移动选择
  226.   #--------------------------------------------------------------------------
  227.   def start_move_select
  228.     # 开启标志
  229.     @phase4_move_select = true
  230.     # 光标移动
  231.     $game_cursor.moveto(@old_grid.x, @old_grid.y)
  232.     # 光标可见
  233.     $game_cursor.direction = 2
  234.     # 取得可移动范围
  235.     @move_grids = get_move_range(@old_grid, @active_battler.move_range)
  236.     # 移动范围闪烁
  237.     for grid in @move_grids
  238.       @spriteset.tilemap.flash_data[grid.x, grid.y] = MOVE_COLOR
  239.     end
  240.   end
  241.   #--------------------------------------------------------------------------
  242.   # ◎结束移动选择
  243.   #--------------------------------------------------------------------------
  244.   def end_move_select
  245.     # 关闭标志
  246.     @phase4_move_select = false
  247.     # 关闭状态窗口
  248.     @slg_status_window.visible = false
  249.     # 取消移动范围闪烁
  250.     for grid in @move_grids
  251.       @spriteset.tilemap.flash_data[grid.x, grid.y] = 0x000
  252.     end
  253.     # 光标不可见
  254.     $game_cursor.direction = 8
  255.     # 地图滚动
  256.     $game_map.chaochaoc(@old_grid.x, @old_grid.y, 7)
  257.   end
  258.   #--------------------------------------------------------------------------
  259.   # ◎移动范围刷新
  260.   #--------------------------------------------------------------------------
  261.   def update_phase4_move_select
  262.     index = @active_battler.event_id
  263.     # 正在移动中就返回
  264.     if $game_map.events[index].moving?
  265.       return
  266.     end
  267.     #更新光标
  268.     $game_cursor.update
  269.     # 按下 B 键的情况下
  270.     if Input.trigger?(Input::B)
  271.       # 演奏取消 SE
  272.       $game_system.se_play($data_system.cancel_se)
  273.       # 结束移动选择
  274.       end_move_select
  275.       # 设置角色指令窗口
  276.       setup_command_window
  277.       return
  278.     end
  279.     # 按下 C 键的情况下
  280.     if Input.trigger?(Input::C)
  281.       # 检查是否能移动到该格
  282.       if (grid = get_grid(@move_grids, $game_cursor.x, $game_cursor.y)) != false
  283.         setup_path(index, grid)
  284.         start_event(index)
  285.         # 设置已行动标志
  286.         @active_battler.have_moved = true
  287.         # 记录新位置
  288.         change_coordinate(@active_battler.event_id, @old_grid.x, @old_grid.y,
  289.         grid.x, grid.y)
  290.         # 结束移动选择
  291.         end_move_select
  292.         # 设置角色指令窗口
  293.         setup_command_window
  294.       end
  295.     end
  296.   end
  297.   #==========================================================================
  298.   # ■ 特技选择
  299.   #==========================================================================
  300.   #--------------------------------------------------------------------------
  301.   # ◎开始特技选择
  302.   #--------------------------------------------------------------------------
  303.   def start_skill_select
  304.     # 开启标志
  305.     @phase4_skill_select = true
  306.     # 生成特技窗口
  307.     @skill_window = Window_Skill.new(@active_battler)
  308.     # 关联帮助窗口
  309.     @skill_window.help_window = @help_window
  310.   end
  311.   #--------------------------------------------------------------------------
  312.   # ◎选择特技结束
  313.   #--------------------------------------------------------------------------
  314.   def end_skill_select
  315.     # 释放特技窗口
  316.     @skill_window.dispose
  317.     @skill_window = nil
  318.     # 关闭标志
  319.     @phase4_skill_select = false
  320.     # 隐藏帮助窗口
  321.     @help_window.visible = false
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # ● 刷新画面 (角色命令回合 : 选择特技)
  325.   #--------------------------------------------------------------------------
  326.   def update_phase4_skill_select
  327.     # 设置特技窗口为可视状态
  328.     @skill_window.visible = true
  329.     # 刷新特技窗口
  330.     @skill_window.update
  331.     # 按下 B 键的情况下
  332.     if Input.trigger?(Input::B)
  333.       # 演奏取消 SE
  334.       $game_system.se_play($data_system.cancel_se)
  335.       # 结束特技选择
  336.       end_skill_select
  337.       # 设置角色指令窗口
  338.       setup_command_window
  339.       return
  340.     end
  341.     # 按下 C 键的情况下
  342.     if Input.trigger?(Input::C)
  343.       # 获取特技选择窗口现在选择的特技的数据
  344.       @skill = @skill_window.skill
  345.       # 无法使用的情况下
  346.       if @skill == nil or not @active_battler.skill_can_use?(@skill.id)
  347.         # 演奏冻结 SE
  348.         $game_system.se_play($data_system.buzzer_se)
  349.         return
  350.       end
  351.       # 演奏确定 SE
  352.       $game_system.se_play($data_system.decision_se)
  353.       # 设置行动
  354.       @active_battler.current_action.skill_id = @skill.id
  355.       make_range_and_aoe(@skill)
  356.       # 设置特技窗口为不可见状态
  357.       @skill_window.visible = false
  358.       # 效果范围是单体的情况下
  359.       if @skill.scope == 1 or @skill.scope == 3 or @skill.scope == 5
  360.         # 记录窗口
  361.         @ex_window = 1
  362.         # 开始选择目标
  363.         start_target_select
  364.         # 选择特技结束
  365.         end_skill_select
  366.       # 效果范围不是单体的情况下
  367.       else
  368.         # 选择特技结束
  369.         end_skill_select
  370.       end
  371.       return
  372.     end
  373.   end
  374.   #==========================================================================
  375.   # ■ 物品选择
  376.   #==========================================================================
  377.   #--------------------------------------------------------------------------
  378.   # ◎开始物品选择
  379.   #--------------------------------------------------------------------------
  380.   def start_item_select
  381.     # 开启标志
  382.     @phase4_item_select = true
  383.     # 生成物品窗口
  384.     @item_window = Window_Item.new#(@active_battler)保留做每个角色独立物品
  385.     # 关联帮助窗口
  386.     @item_window.help_window = @help_window
  387.   end
  388.   #--------------------------------------------------------------------------
  389.   # ◎选择物品结束
  390.   #--------------------------------------------------------------------------
  391.   def end_item_select
  392.     # 释放物品窗口
  393.     @item_window.dispose
  394.     @item_window = nil
  395.     # 关闭标志
  396.     @phase4_item_select = false
  397.     # 隐藏帮助窗口
  398.     @help_window.visible = false
  399.   end
  400.   #--------------------------------------------------------------------------
  401.   # ● 刷新画面 (角色命令回合 : 选择物品)
  402.   #--------------------------------------------------------------------------
  403.   def update_phase4_item_select
  404.    

  405.     # 设置物品窗口为可视状态
  406.     @item_window.visible = true
  407.     # 刷新物品窗口
  408.     @item_window.update
  409.     # 按下 B 键的情况下
  410.     if Input.trigger?(Input::B)
  411.       # 演奏取消 SE
  412.       $game_system.se_play($data_system.cancel_se)
  413.       # 结束物品选择
  414.       end_item_select
  415.       # 设置角色指令窗口
  416.       setup_command_window
  417.       return
  418.     end
  419.     # 按下 C 键的情况下
  420.     if Input.trigger?(Input::C)
  421.       # 获取物品选择窗口现在选择的物品的数据
  422.       @item = @item_window.item
  423.       # 无法使用的情况下
  424.       unless $game_party.item_can_use?(@item.id)
  425.         # 演奏冻结 SE
  426.         $game_system.se_play($data_system.buzzer_se)
  427.         return
  428.       end
  429.       # 演奏确定 SE
  430.       $game_system.se_play($data_system.decision_se)
  431.       # 设置行动
  432.       @active_battler.current_action.item_id = @item.id
  433.       

  434.       make_range_and_aoe(@item)
  435.       # 设置物品窗口为不可见状态
  436.       @item_window.visible = false
  437.       # 效果范围是单体的情况下
  438.       if @item.scope == 1 or @item.scope == 3 or @item.scope == 5
  439.         # 记录窗口
  440.         @ex_window = 1
  441.         # 开始选择目标
  442.         start_target_select
  443.         # 选择物品结束
  444.         end_item_select
  445.       # 效果范围不是单体的情况下
  446.       else
  447.         # 选择物品结束
  448.         end_item_select
  449.       end
  450.       return
  451.     end
  452.   end
  453.   #==========================================================================
  454.   # ■ 目标选择
  455.   #==========================================================================
  456.   #--------------------------------------------------------------------------
  457.   # ◎开始目标选择
  458.   #--------------------------------------------------------------------------
  459.   def start_target_select
  460.     # 开启标志
  461.     @phase4_target_select = true
  462.     # 光标移动
  463.     $game_cursor.moveto(@now_grid.x, @now_grid.y)
  464.     # 光标可见
  465.     $game_cursor.direction = 2
  466.     # 取得射程范围
  467.     @target_grids = get_target_range(
  468.     @now_grid, @active_battler.current_action.range)
  469.     # 初始化作用范围
  470.     @aoe_grids = []
  471.     # 射程范围闪烁
  472.     for grid in @target_grids
  473.       @spriteset.tilemap.flash_data[grid.x, grid.y] = MOVE_COLOR
  474.     end
  475.     # 范围闪烁
  476.     target_grid = Grid.new($game_cursor.x, $game_cursor.y)
  477.     @aoe_grids = get_target_aoe(target_grid, @active_battler.current_action.aoe)
  478.     for grid in @aoe_grids
  479.       if @target_grids.include?(grid)
  480.         @spriteset.tilemap.flash_data[grid.x, grid.y] = TARGET_COLOR
  481.       else
  482.         @spriteset.tilemap.flash_data[grid.x, grid.y] = TARGET_OUT_COLOR
  483.       end
  484.     end
  485.   end
  486.   #--------------------------------------------------------------------------
  487.   # ◎结束目标选择
  488.   #--------------------------------------------------------------------------
  489.   def end_target_select
  490.     # 关闭标志
  491.     @phase4_target_select = false
  492.     # 关闭状态窗口
  493.     @slg_status_window.visible = false
  494.     # 取消移动范围闪烁
  495.     for grid in (@target_grids + @aoe_grids)
  496.       @spriteset.tilemap.flash_data[grid.x, grid.y] = 0x000
  497.     end
  498.     # 光标不可见
  499.     $game_cursor.direction = 8
  500.     # 地图滚动
  501.     $game_map.chaochaoc(@now_grid.x, @now_grid.y, 7)
  502.    

  503.   end
  504.   #--------------------------------------------------------------------------
  505.   # ◎目标选择刷新
  506.   #--------------------------------------------------------------------------
  507.   def update_phase4_target_select
  508.     # 记录光标位置
  509.     old_cursor_x = $game_cursor.x
  510.     old_cursor_y = $game_cursor.y
  511.     # 更新光标
  512.     $game_cursor.update
  513.     index = @active_battler.event_id
  514.     # 光标移动了的话
  515.     if $game_cursor.x != old_cursor_x or $game_cursor.y != old_cursor_y
  516.       # 原来范围闪烁停止
  517.       for grid in @aoe_grids
  518.         if grid.compare_grids(@target_grids)
  519.           @spriteset.tilemap.flash_data[grid.x, grid.y] = MOVE_COLOR
  520.         else
  521.           @spriteset.tilemap.flash_data[grid.x, grid.y] = 0x000
  522.         end
  523.       end
  524.       # 更新范围
  525.       target_grid = Grid.new($game_cursor.x, $game_cursor.y)
  526.       @aoe_grids = get_target_aoe(target_grid, @active_battler.current_action.aoe)
  527.       # 范围闪烁
  528.       for grid in @aoe_grids
  529.         if grid.compare_grids(@target_grids)
  530.           @spriteset.tilemap.flash_data[grid.x, grid.y] = TARGET_COLOR
  531.         else
  532.           @spriteset.tilemap.flash_data[grid.x, grid.y] = TARGET_OUT_COLOR
  533.         end
  534.       end
  535.     end
  536.     # 按下 B 键的情况下
  537.     if Input.trigger?(Input::B)
  538.       # 演奏取消 SE
  539.       $game_system.se_play($data_system.cancel_se)
  540.       # 结束目标选择
  541.       end_target_select
  542.       # 判断之前的窗口
  543.       if @ex_window == 1
  544.         # 返回特技选择
  545.         start_skill_select
  546.       elsif @ex_window == 2
  547.         # 返回物品选择
  548.         start_item_select
  549.       else
  550.         # 返回角色指令
  551.         setup_command_window
  552.       end
  553.       return
  554.     end
  555.     # 按下 C 键的情况下
  556.     if Input.trigger?(Input::C)
  557.       target_grid = Grid.new($game_cursor.x, $game_cursor.y)
  558.       # 检查是否在射程内
  559.       for grid in @target_grids
  560.         if grid.x == $game_cursor.x and grid.y == $game_cursor.y
  561.           available = true
  562.           break
  563.         end
  564.       end
  565.       if available != true
  566.         return
  567.       end
  568.       # 设置目标坐标
  569.       @active_battler.current_action.target_grid = target_grid
  570.       # 特技范围为己方非HP0的话
  571.       if @active_battler.current_action.for_friend?
  572.         return unless get_target_friend
  573.       # 特技范围为己方HP0的话
  574.       elsif @active_battler.current_action.for_friend?(true)
  575.         return unless get_target_friend(true)
  576.       # 特技范围为敌方的话
  577.       elsif  @active_battler.current_action.for_enemy?
  578.         return unless get_target_enemy
  579.       end
  580.       # 结束目标选择
  581.       end_target_select
  582.       # 开始行动回合
  583.       start_phase5
  584.     end
  585.   end
  586. end   
复制代码


在使用攻击指令的时候提示:
脚本'Scene_SLG(杂乱的方法)'的164行发生了NoMethodError.undefined method 'user_range?, for nil:NilClass
我查看了脚本,是下面这句错误。。。。
    if action.user_range?
      @active_battler.current_action.range = @active_battler.range +
      action.range

  1. class Scene_SLG
  2.   #--------------------------------------------------------------------------
  3.   # ● 刷新解释器
  4.   #--------------------------------------------------------------------------
  5.   def interpreter_update
  6.     # 执行战斗事件中的情况下
  7.     if $game_system.battle_interpreter.running?
  8.       # 刷新解释器
  9.       $game_system.battle_interpreter.update
  10.       # 强制行动的战斗者不存在的情况下
  11.       #if $game_temp.forcing_battler == nil
  12.         # 执行战斗事件结束的情况下
  13.         #unless $game_system.battle_interpreter.running?
  14.           # 继续战斗的情况下、再执行战斗事件的设置
  15.           #unless judge
  16.             #setup_battle_event
  17.           #end
  18.         #end
  19.         # 如果不是结束战斗回合的情况下
  20.         #if @phase != 5
  21.           # 刷新状态窗口
  22.           #@status_window.refresh
  23.         #end
  24.       #end
  25.     end
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 调用商店
  29.   #--------------------------------------------------------------------------
  30.   def call_shop
  31.     # 清除商店调用标志
  32.     $game_temp.shop_calling = false
  33.     # 矫正主角姿势
  34.     $game_player.straighten
  35.     # 切换到商店画面
  36.     $scene = Scene_Shop.new
  37.   end
  38.   #--------------------------------------------------------------------------
  39.   # ● 调用名称输入
  40.   #--------------------------------------------------------------------------
  41.   def call_name
  42.     # 清除商店调用名称输入标志
  43.     $game_temp.name_calling = false
  44.     # 矫正主角姿势
  45.     $game_player.straighten
  46.     # 切换到名称输入画面
  47.     $scene = Scene_Name.new
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 调用菜单
  51.   #--------------------------------------------------------------------------
  52.   def call_menu
  53.     # 清除商店调用菜单标志
  54.     $game_temp.menu_calling = false
  55.     # 已经设置了菜单 SE 演奏标志的情况下
  56.     if $game_temp.menu_beep
  57.       # 演奏确定 SE
  58.       $game_system.se_play($data_system.decision_se)
  59.       # 清除菜单演奏 SE 标志
  60.       $game_temp.menu_beep = false
  61.     end
  62.     # 矫正主角姿势
  63.     $game_player.straighten
  64.     # 切换到菜单画面
  65.     $scene = Scene_Menu.new
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 调用存档
  69.   #--------------------------------------------------------------------------
  70.   def call_save
  71.     # 矫正主角姿势
  72.     $game_player.straighten
  73.     # 切换到存档画面
  74.     $scene = Scene_Save.new
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ● 调用调试
  78.   #--------------------------------------------------------------------------
  79.   def call_debug
  80.     # 清除商店调用调试标志
  81.     $game_temp.debug_calling = false
  82.     # 演奏确定 SE
  83.     $game_system.se_play($data_system.decision_se)
  84.     # 矫正主角姿势
  85.     $game_player.straighten
  86.     # 切换到调试画面
  87.     $scene = Scene_Debug.new
  88.   end
  89.   #--------------------------------------------------------------------------
  90.   # ● 主角的场所移动
  91.   #--------------------------------------------------------------------------
  92.   def transfer_player
  93.     # 清除主角场所移动调试标志
  94.     $game_temp.player_transferring = false
  95.     # 移动目标与现在的地图有差异的情况下
  96.     if $game_map.map_id != $game_temp.player_new_map_id
  97.       # 设置新地图
  98.       $game_map.setup($game_temp.player_new_map_id)
  99.     end
  100.     # 设置主角位置
  101.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  102.     # 设置主角朝向
  103.     case $game_temp.player_new_direction
  104.     when 2  # 下
  105.       $game_player.turn_down
  106.     when 4  # 左
  107.       $game_player.turn_left
  108.     when 6  # 右
  109.       $game_player.turn_right
  110.     when 8  # 上
  111.       $game_player.turn_up
  112.     end
  113.     # 矫正主角姿势
  114.     $game_player.straighten
  115.     # 刷新地图 (执行并行事件)
  116.     $game_map.update
  117.     # 在生成活动块
  118.     @spriteset.dispose
  119.     @spriteset = Spriteset_Map.new
  120.     # 处理过渡中的情况下
  121.     if $game_temp.transition_processing
  122.       # 清除过渡处理中标志
  123.       $game_temp.transition_processing = false
  124.       # 执行过渡
  125.       Graphics.transition(20)
  126.     end
  127.     # 执行地图设置的 BGM、BGS 的自动切换
  128.     $game_map.autoplay
  129.     # 设置画面
  130.     Graphics.frame_reset
  131.     # 刷新输入信息
  132.     Input.update
  133.   end
  134.   #--------------------------------------------------------------------------
  135.   # ◎记录战斗者坐标
  136.   #--------------------------------------------------------------------------
  137.   def record_coordinate
  138.     # 设置地图坐标列表
  139.     @battler_coordinate = Table.new($game_map.data.xsize,$game_map.data.ysize)
  140.     for battler in @battlers
  141.       # 跳过nil值
  142.       next if battler == nil
  143.       # 忽略死亡单位
  144.       if !battler.death
  145.         @battler_coordinate[$game_map.events[battler.event_id].x,
  146.         $game_map.events[battler.event_id].y] = battler.event_id
  147.      #elsif battler.is_a?(Game_Actor) ★★特别注意!!如果要设置角色复活魔法,在这里要改
  148.        #@battler_coordinate[$game_map.events[battler.event_id].x,
  149.        #$game_map.events[battler.event_id].y] = battler.event_id
  150.       end
  151.     end
  152.   end
  153.   #--------------------------------------------------------------------------
  154.   # ◎更改战斗者坐标
  155.   #--------------------------------------------------------------------------
  156.   def change_coordinate(event_id, old_x, old_y, new_x, new_y)
  157.     @battler_coordinate[old_x, old_y] = 0
  158.     @battler_coordinate[new_x, new_y] = event_id
  159.   end
  160.   #--------------------------------------------------------------------------
  161.   # ◎生成射程及作用范围
  162.   #--------------------------------------------------------------------------
  163.   def make_range_and_aoe(action)
  164.     if action.user_range?
  165.       @active_battler.current_action.range = @active_battler.range +
  166.       action.range
  167.     else
  168.       @active_battler.current_action.range = action.range
  169.     end
  170.     if action.user_aoe?
  171.       @active_battler.current_action.aoe = @active_battler.aoe +
  172.       action.aoe
  173.     else
  174.       @active_battler.current_action.aoe = action.aoe
  175.     end
  176.   end
  177.   #--------------------------------------------------------------------------
  178.   # 修改面向,让a面向b(柳柳)b可以是Grid类
  179.   #--------------------------------------------------------------------------  
  180.   def a_faceto_b(a,b)
  181.     return if b == nil
  182.     sx = a.x - b.x
  183.     sy = a.y - b.y
  184.     if sx == 0 and sy == 0
  185.       return
  186.     end
  187.     # 横侧距离长的情况下
  188.     if sx.abs > sy.abs
  189.       sx > 0 ? a.turn_left : a.turn_right
  190.     # 竖侧距离长的情况下
  191.     else
  192.       sy > 0 ? a.turn_up : a.turn_down
  193.     end
  194.   end
  195. end   
复制代码

请知道的前辈指导下。。。
作者: ☆流星☆~~~    时间: 2009-4-26 05:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 无心孤云    时间: 2009-4-26 05:42
我现在时出现了个脚本错误。。。不知道为什么{/dk}
作者: sjzzjl    时间: 2009-4-26 06:33
发脚本错误信息来
作者: 无心孤云    时间: 2009-4-26 21:02
前辈。错误信息我发在上面了呀
作者: 无心孤云    时间: 2009-4-26 21:27
附上出错的脚本全文乐。。。
作者: 无心孤云    时间: 2009-4-27 20:25
惨哪
没前辈指导下么。。
作者: 叶子    时间: 2009-4-27 20:54
第一个错误:
@spriteset.tilemap.flash_data[grid.x, grid.y] = MOVE_COLOR
如果出现了NoMethodError.undefined method '[]='的话,说明tilemap里面的flash_data还是nil而不是Table
第二个错误:
阿尔西斯战记中的攻击默认是82号特技,在你的工程中,估计并没有82个特技吧,所以超出范围返回nil了

解决方案:
最简单的方法是直接在阿尔西斯战记的工程上做游戏而不是把它的脚本复制到新工程中,即使要复制脚本也要把所有脚本都复制了,数据库也要相应设置一下 [LINE]1,#dddddd[/LINE]系统信息:本贴获得楼主认可,66RPG感谢您的热情解答~
作者: 无心孤云    时间: 2009-4-27 23:10
整合过去了....好象旧问题解决了一半.....就是移动的时候有范围了...不过却没有选框和不会移动....是不是这个战棋系统和KKME整合系统v0.12脚本冲突呢.,,,
作者: 无心孤云    时间: 2009-4-27 23:16
我是想做rpg
只是战斗的时候切换到战棋
KKME整合系统v0.12是我一直使用的主系统....
如果现在要这么弄上去的话
是不是要放弃KKME整合系统v0.12...再重新整合呢?{/dk}
作者: 叶子    时间: 2009-4-27 23:24
那就用别个的封装的更好的战棋系统吧,阿尔西斯战记太混帐,做的时候随手乱改,所以冲突性很大
作者: 林Z明    时间: 2009-4-27 23:27
我最近也在研究战棋模式~
作者: 无心孤云    时间: 2009-4-27 23:29
我只找到阿尔这个有教程的战棋系统...

请问叶子前辈
现在我更改好了后
点移动和攻击在Scene_SLG(指令回合)第七十行又出现错误....
请问是哪冲突了呢?请再麻烦下告诉我...我好继续修改....
      @slg_status_window.refresh @battlers[@battler_coordinate[@status_x,@status_y]]
    else
      @slg_status_window.visible = false
作者: 叶子    时间: 2009-4-27 23:50
请告诉我错误信息是啥
我想KKME整合系统再怎么强大也不可能动到我Scene_SLG类的头上来吧 :/

说到教程,还是得感谢小白木 :]
作者: 无心孤云    时间: 2009-4-28 00:01
脚本scene_slg(指令回合)的70行发生了NoMethodError.undefined method refresh for nil:Nilclass

就是这条
作者: 叶子    时间: 2009-4-28 00:27
这个错误应该是@slg_status_window没有被初始化
错误出现之前状态窗口有没有显示过出来呢?
估计需要发工程上来
作者: 叶子    时间: 2009-4-28 00:27
剑专了,编辑掉
作者: 无心孤云    时间: 2009-4-28 00:32
叶子前辈.我那个工程有80多M....因为我先做的地图....那我应该发哪些上来呢?还是发data里的文件就可以了呢?谢谢叶子前辈
作者: 叶子    时间: 2009-4-28 00:38
那发一下data应该可以

ps:不用前辈前辈的
作者: 无心孤云    时间: 2009-4-28 00:57
我整理了下。把没用到的都先删掉了。现在还有2M多点。在论坛传到头都大了还没传完
叶子前辈有QQ么?QQ上传给你?

PS:达者为师,指导我的都是前辈,这是宗旨哦!



作者: 叶子    时间: 2009-4-28 01:11
Scene_SLG(主流程) 第42行
  1.     # 生成地图状态窗口
  2. #   @slg_status_window = Window_SLG_Status.new
复制代码

注释掉以后,@slg_status_window就没有被初始化了,后面当然出错了..估计是因为这行出错才注释掉吧
原因应该是脚本没有复制全,这里是 柳柳-Window_SLG_Status 和 ショウ-显示血条,还有没其它就不清楚了
阿尔西斯战记工程中,所有带个◎脚本都是经过少量修改的,这些脚本可以复制整个或只移植修改的地方。所有名字跟原装脚本不一样的脚本都是新的,这些都要复制过去
作者: 无心孤云    时间: 2009-4-28 01:21
啊!对
之前因为一直不行所以我用了排除法一个一个的弄
到后面一直失败就忘记弄上去了
现在我都全补充上去了
然后刚进去弄的时候发现有显示闪烁了。。。
同时晕人的是还没完全成功,,,
就是有范围但是却没有可选择移动到哪的那个方格圈。。。
然后出现新的错误
和之前使用的脚本有冲突。。。也就是其中哪个|-Bitmap(描绘渐变色)
出现问题:|-Bitmap(描绘渐变色)的13行发生了systemstackerror stack level roo deep
我试图删除此脚本,但是删除后依然是失败的。。。
作者: 叶子    时间: 2009-4-28 01:22
还有在还没进入战斗的时候,在那可以看状态之类的,本来看状态看物品等是不改变背景的,现在整合了战旗系统后看状态什么的背景都是黑色了

这个的话,要加背景一般是加个Spriteset_Map之类的,但是在Scene_Menu中看不到这个东西,所以也不清楚了..理论上战棋的脚本没有碰Scene_Menu这些地方
作者: 无心孤云    时间: 2009-4-28 01:24
这个背景问题先不管了。。。现在我重新上传了补充好哪些脚本的。。。
出现了这个新问题
再此麻烦前辈下
更改仲。。。
作者: 叶子    时间: 2009-4-28 01:37
以下引用xcyog于2009-4-27 17:21:32的发言:

啊!对
之前因为一直不行所以我用了排除法一个一个的弄
到后面一直失败就忘记弄上去了
现在我都全补充上去了
然后刚进去弄的时候发现有显示闪烁了。。。
同时晕人的是还没完全成功,,,
就是有范围但是却没有可选择移动到哪的那个方格圈。。。
然后出现新的错误
和之前使用的脚本有冲突。。。也就是其中哪个|-Bitmap(描绘渐变色)
出现问题:|-Bitmap(描绘渐变色)的13行发生了systemstackerror stack level roo deep
我试图删除此脚本,但是删除后依然是失败的。。。

原因是ショウ的东西太好用了,导致KKME整合系统和战棋系统中都有用他的脚本,两次重复alias造成此错误
把 ショウ-显示血条 中下面这些内容去掉即可,其他不用动
  1.   #--------------------------------------------------------------------------
  2.   # ● HP ゲージの描画
  3.   #--------------------------------------------------------------------------
  4.   # オリジナルのHP描画を draw_actor_hp_original と名前変更
  5.   alias :draw_actor_hp_original :draw_actor_hp
  6.   def draw_actor_hp(actor, x, y, width = 144)
  7.     # 変数rateに 現在のHP/MHPを代入
  8.     if actor.maxhp != 0
  9.       rate = actor.hp.to_f / actor.maxhp
  10.     else
  11.       rate = 0
  12.     end
  13.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  14.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  15.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  16.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  17.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  18.     plus_x = 0
  19.     rate_x = 0
  20.     plus_y = 25
  21.     plus_width = 0
  22.     rate_width = 100
  23.     height = 10
  24.     align1 = 1
  25.     align2 = 2
  26.     align3 = 0
  27.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  28.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  29.     grade1 = 1
  30.     grade2 = 0
  31.     # 色設定。color1:外枠,color2:中枠
  32.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  33.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  34.     color1 = Color.new(0, 0, 0, 192)
  35.     color2 = Color.new(255, 255, 192, 192)
  36.     color3 = Color.new(0, 0, 0, 192)
  37.     color4 = Color.new(64, 0, 0, 192)
  38.     color5 = Color.new(80 - 24 * rate, 80 * rate, 14 * rate, 192)
  39.     color6 = Color.new(240 - 72 * rate, 240 * rate, 62 * rate, 192)
  40.     # 変数spに描画するゲージの幅を代入
  41.     if actor.maxhp != 0
  42.       hp = (width + plus_width) * actor.hp * rate_width / 100 / actor.maxhp
  43.     else
  44.       hp = 0
  45.     end
  46.     # ゲージの描画
  47.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  48.                 width, plus_width + width * rate_width / 100,
  49.                 height, hp, align1, align2, align3,
  50.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  51.     # オリジナルのHP描画処理を呼び出し
  52.     draw_actor_hp_original(actor, x, y, width)
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● SP ゲージの描画
  56.   #--------------------------------------------------------------------------
  57.   # オリジナルのSP描画を draw_actor_sp_original と名前変更
  58.   alias :draw_actor_sp_original :draw_actor_sp
  59.   def draw_actor_sp(actor, x, y, width = 144)
  60.     # 変数rateに 現在のSP/MSPを代入
  61.     if actor.maxsp != 0
  62.       rate = actor.sp.to_f / actor.maxsp
  63.     else
  64.       rate = 1
  65.     end
  66.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  67.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  68.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  69.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  70.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  71.     plus_x = 0
  72.     rate_x = 0
  73.     plus_y = 25
  74.     plus_width = 0
  75.     rate_width = 100
  76.     height = 10
  77.     align1 = 1
  78.     align2 = 2
  79.     align3 = 0
  80.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  81.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  82.     grade1 = 1
  83.     grade2 = 0
  84.     # 色設定。color1:外枠,color2:中枠
  85.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  86.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  87.     color1 = Color.new(0, 0, 0, 192)
  88.     color2 = Color.new(255, 255, 192, 192)
  89.     color3 = Color.new(0, 0, 0, 192)
  90.     color4 = Color.new(0, 64, 0, 192)
  91.     color5 = Color.new(14 * rate, 80 - 24 * rate, 80 * rate, 192)
  92.     color6 = Color.new(62 * rate, 240 - 72 * rate, 240 * rate, 192)
  93.     # 変数spに描画するゲージの幅を代入
  94.     if actor.maxsp != 0
  95.       sp = (width + plus_width) * actor.sp * rate_width / 100 / actor.maxsp
  96.     else
  97.       sp = (width + plus_width) * rate_width / 100
  98.     end
  99.     # ゲージの描画
  100.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  101.                 width, plus_width + width * rate_width / 100,
  102.                 height, sp, align1, align2, align3,
  103.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  104.     # オリジナルのSP描画処理を呼び出し
  105.     draw_actor_sp_original(actor, x, y, width)
  106.   end
  107.   #--------------------------------------------------------------------------
  108.   # ● EXP ゲージの描画
  109.   #--------------------------------------------------------------------------
  110.   # オリジナルのEXP描画を draw_actor_sp_original と名前変更
  111.   alias :draw_actor_exp_original :draw_actor_exp
  112.   def draw_actor_exp(actor, x, y, width = 204)
  113.     # 変数rateに 現在のexp/nextexpを代入
  114.     if actor.next_exp != 0
  115.       rate = actor.now_exp.to_f / actor.next_exp
  116.     else
  117.       rate = 1
  118.     end
  119.     # plus_x:X座標の位置補正 rate_x:X座標の位置補正(%) plus_y:Y座標の位置補正
  120.     # plus_width:幅の補正 rate_width:幅の補正(%) height:縦幅
  121.     # align1:描画タイプ1 0:左詰め 1:中央揃え 2:右詰め
  122.     # align2:描画タイプ2 0:上詰め 1:中央揃え 2:下詰め
  123.     # align3:ゲージタイプ 0:左詰め 1:右詰め
  124.     plus_x = 0
  125.     rate_x = 0
  126.     plus_y = 25
  127.     plus_width = 0
  128.     rate_width = 100
  129.     height = 10
  130.     align1 = 1
  131.     align2 = 2
  132.     align3 = 0
  133.     # グラデーション設定 grade1:空ゲージ grade2:実ゲージ
  134.     # (0:横にグラデーション 1:縦にグラデーション 2:斜めにグラデーション(激重))
  135.     grade1 = 1
  136.     grade2 = 0
  137.     # 色設定。color1:外枠,color2:中枠
  138.     # color3:空ゲージダークカラー,color4:空ゲージライトカラー
  139.     # color5:実ゲージダークカラー,color6:実ゲージライトカラー
  140.     color1 = Color.new(0, 0, 0, 192)
  141.     color2 = Color.new(255, 255, 192, 192)
  142.     color3 = Color.new(0, 0, 0, 192)
  143.     color4 = Color.new(64, 0, 0, 192)
  144.     color5 = Color.new(80 * rate, 80 - 80 * rate ** 2, 80 - 80 * rate, 192)
  145.     color6 = Color.new(240 * rate, 240 - 240 * rate ** 2, 240 - 240 * rate, 192)
  146.     # 変数expに描画するゲージの幅を代入
  147.     if actor.next_exp != 0
  148.       exp = (width + plus_width) * actor.now_exp * rate_width /
  149.                                                           100 / actor.next_exp
  150.     else
  151.       exp = (width + plus_width) * rate_width / 100
  152.     end
  153.     # ゲージの描画
  154.     gauge_rect(x + plus_x + width * rate_x / 100, y + plus_y,
  155.                 width, plus_width + width * rate_width / 100,
  156.                 height, exp, align1, align2, align3,
  157.                 color1, color2, color3, color4, color5, color6, grade1, grade2)
  158.     # オリジナルのEXP描画処理を呼び出し
  159.     draw_actor_exp_original(actor, x, y)
  160.   end
复制代码

作者: 无心孤云    时间: 2009-4-28 01:48
终于又解决一个问题了
我把所有的东西都补全了。包括以前删除的脚本
然后现在移动也没问题了
但是又出现了俩个问题
一是进入战斗的时候会突然出现:(好像这个问题在敌人先行动的时候会出现)
脚本scene_slg(敌人AI)的196行发生nomethoderror undefined method setup_event for nil:nilclass

晕呀。。。。

http://rpg.blue/upload_program/d/xcyog_新问题_121282716.rar

作者: 无心孤云    时间: 2009-6-12 08:00
哦,谢谢叶子前辈。
我去把一样的脚本更改为阿尔西斯战记的脚本看看

作者: 叶子    时间: 2009-6-12 08:00
只能说冲突可能无限大..如果你是做战棋的话,不妨以战棋系统为核心,额外需要的功能再一点一点整合上去。




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