查看: 2389|回复: 5

[已经过期] 装备栏弹出脚本错误

[复制链接]
梦石
0
星屑
3850
在线时间
1899 小时
注册时间
2010-6-19
回帖
917
发表于 2022-7-28 21:54:16 | 显示全部楼层 |阅读模式

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

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

×
用了装备整合脚本,武器和物品栏放在一块了,然后使用装备的时候,弹出脚本错误~

2.png


[pre lang="ruby"]#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
#  处理物品画面的类。
#==============================================================================

class Scene_Item
  #--------------------------------------------------------------------------
  # ● 初始化对像■■■■■■■■■■■■■■■■■■■■■■
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0, equip_index = 0)
    @actor_index = actor_index # 返回菜单用
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main

    # 获取角色
    @actor = $game_party.actors[@actor_index]
   
    # 获取角色现在装备的物品
    @right_window = Window_Eq.new(@actor)
    # 隐藏装备栏索引
    @right_window.index = -1
    # 隐藏装备栏窗口
    @right_window.active = false
   
    # 生成装备帮助窗口
    @help1_window = Actor_Item_Help.new
    # 关联装备帮助窗口
    @right_window.help_window = @help1_window
    @right_window.help_window.z = 2000
   
    # 提示窗口
    @tip = Window_Tip_Item.new
   
    # 显示人物动态图窗口
    @dongtaitu_window = Window_dtt.new(@actor)
   
    # 生成物品分类窗口
    @itemcommand_window = Fenlei_Command.new
    @command_index = @itemcommand_window.index
   
    # 生成物品窗口
    @itemlist_window = Actor_Item.new(@actor)
    @itemlist_window.active = false
   
    # 生成物品帮助窗口
    @help_window = Actor_Item_Help.new
   
    # 关联物品帮助窗口
    @itemlist_window.help_window = @help_window
   
    # 生成目标窗口 (设置为不可见・不活动)
    @target_window = Window_Target_zl.new
    @target_window.visible = false
    @target_window.active = false
   
    # 生成头像框
    @sthero_window = Window_Sthero.new
   
    # 显示游戏界面1图片
    @jiemian = Sprite.new
    @jiemian.bitmap = Bitmap.new("Graphics/Pictures/Ui/主界面/游戏界面1")
    @jiemian.z = 200   
    # 显示游戏界面2图片
    @jiemian1 = Sprite.new
    @jiemian1.bitmap = Bitmap.new("Graphics/Pictures/Ui/主界面/游戏界面2")
    @jiemian1.y = 715
    @jiemian1.z = 200
   
    # 生成背景图窗口
    @back = Sprite.new
    @back.bitmap = Bitmap.new("Graphics/Pictures/Ui/物品界面/物品背景")  
    @back.y = (768-555)/2-53/2
    @back.z = 200
   
    # 生成现实时间窗口
    @realtime_window = Window_RealTime.new
    # 生成游戏时间窗口
    @playtime_window = Window_PlayTime.new
   
    # 显示队伍头像
    @dtx = Window_DuiTouxiang.new
   
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 58
    @gold_window.y = 571
    @gold_window.opacity = 0
   
    # 生成队标窗口
    @db = Window_db.new
    # 队伍人数大于1
    if $game_party.actors.size <= 1
      # 隐藏队标窗口
      @db.visible = false
    else
      # 显示队标窗口
      @db.visible = true
    end
   
    # 物品窗口索引
    @itemlist_window.set_item(@command_index)
    # 执行过度
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换就中断循环
      if $scene != self
        break
      end
    end
    # 装备过渡
    Graphics.freeze
    # 释放物品分类窗口
    @itemcommand_window.dispose
    # 释放物品栏窗口
    @itemlist_window.dispose
    # 释放目标被激活的窗口
    @target_window.dispose
    # 释放提示窗口
    @tip.dispose
    # 释放装备窗口
    @right_window.dispose
    # 释放物品帮助窗口
    @help_window.dispose
    # 释放装备帮助窗口
    @help1_window.dispose
    # 释放人物动态图窗口
    @dongtaitu_window.dispose
    # 释放头像框
    @sthero_window.dispose
    # 释放现实时间窗口
    @realtime_window.dispose
    # 释放游戏时间窗口
    @playtime_window.dispose
    # 释放队伍头像
    @dtx.dispose
    # 释放界面图片
    @jiemian.dispose
    @jiemian.bitmap.dispose
    @jiemian1.dispose
    @jiemian1.bitmap.dispose
    # 释放背景图窗口
    @back.dispose
    # 释放背景图图片
    @back.bitmap.dispose
    # 释放金钱窗口
    @gold_window.dispose
    # 释放队标窗口
    @db.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    #【仿网游动态地图界面】
    $spriteset.update
    # 刷新队伍头像
    @dtx.update
    # 刷新游戏时间窗口
    @playtime_window.update   
    # 刷新显示时间窗口
    @realtime_window.update
    # 刷新装备窗口   
    @right_window.update
    # 物品提示窗口
    @tip.update
    # 刷新物品分类
    @itemcommand_window.update
    # 刷新物品栏窗口
    @itemlist_window.update
    # 刷新人物动态图窗口
    @dongtaitu_window.update
    # 刷新物品帮助窗口
    @help_window.update
    # 刷新装备帮助窗口
    @help1_window.update
    # 刷新头像框
    @sthero_window.update
    # 刷新界面图片
    @jiemian.update
    @jiemian1.update
    # 刷新背景图窗口
    @back.update
    # 刷新金钱窗口
    @gold_window.update
   
    # 队伍人数大于1
    if $game_party.actors.size <= 1
      # 隐藏队标窗口
      @db.visible = false
      # 刷新队标窗口
      @db.update
    else
      # 显示队标窗口
      @db.visible = true
      # 刷新队标窗口
      @db.update
    end
   
    # 调整装备栏光标距离
    irect = @right_window.cursor_rect
      w = @help1_window
    w.x = @right_window.x + irect.x + irect.width + 13
    w.y = @right_window.y + irect.y + irect.height + 13
    if w.x + w.width > 1024
      w.x = 1024 - w.width
    end
    if w.y + w.height > 768
      w.y = 768 - w.height
    end   
   
    # ALT + E 关闭物品菜单
    if Kboard.keyb($R_Key_ALT) == 1
      if Kboard.keyb($R_Key_E) == 1
        # 演奏取消 SE
        $game_system.se_play($data_system.cancel_se)
        # 回到带头角色头像框
        $temp_mapface_id = $game_party.actors[0].id
        # 切换到地图画面
        $scene = Scene_Map.new
        return
      end
      # 防止多按
      if Kboard.keyb($R_Key_Q) == 1
        return
      end
      if Kboard.keyb($R_Key_W) == 1
        return
      end
      if Kboard.keyb($R_Key_R) == 1
        return
      end
      if Kboard.keyb($R_Key_T) == 1
        return
      end
      if Kboard.keyb($R_Key_S) == 1
        return
      end
      if Kboard.keyb($R_Key_D) == 1
        return
      end
      if Kboard.keyb($R_Key_C) == 1
        return
      end
    end  
    # 按下 W 键的情况下
    if Kboard.keyb($R_Key_W) == 1
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至下一位角色
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 角色头像对应角色索引
      $temp_mapface_id = $game_party.actors[@actor_index].id
      # 回到物品栏索引
      $scene = Scene_Item.new(@actor_index)
      return
    end
    # 按下 Q 键的情况下
    if Kboard.keyb($R_Key_Q) == 1
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至上一位角色
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 角色头像对应角色索引
      $temp_mapface_id = $game_party.actors[@actor_index].id
      # 回到物品栏索引
      $scene = Scene_Item.new(@actor_index)
      return
    end      
      
    # 刷新目标被激活的窗口
    @target_window.update
    if @command_index != @itemcommand_window.index
      @command_index = @itemcommand_window.index
      @itemlist_window.set_item(@command_index)
    end
    # 物品分类被激活的情况下: 调用 update_itemcommand
    if @itemcommand_window.active
      update_itemcommand
      return
    end
    # 物品窗口被激活的情况下: 调用 update_itemlist
    if @itemlist_window.active
      update_itemlist
      return
    end
    # 目标窗口被激活的情况下: 调用 update_target
    if @target_window.active
      update_target
      return
    end
    # 角色装备栏被激活的情况下:调用 update_equip
    if @right_window.active
      update_equip
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (物品分类窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_itemcommand
    # 按下 B 键的情况下 主窗口 B 键 退出
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 回到带头角色头像框
      $temp_mapface_id = $game_party.actors[0].id
      # 切换到地图画面
      $scene = Scene_Map.new
      return
    end   
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 如果没有选定命令项
      if @itemlist_window.item_number == 0
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 激活物品分类窗口--关闭
      @itemcommand_window.active = false
      # 显示帮助窗口
      @help_window.visible = true
      # 激活物品栏窗口--打开
      @itemlist_window.active = true
      # 激活物品栏索引为第一个
      @itemlist_window.index = 0
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (目标窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_itemlist
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 打开物品分类
      @itemcommand_window.active = true
      # 关闭物品栏窗口
      @itemlist_window.active = false
      # 隐藏物品栏索引
      @itemlist_window.index = -1
      # 隐藏帮助窗口
      @help_window.visible = false
      @itemcommand_window.index = @command_index
      # 索引返回到0,在回到-1达到隐藏效果
      0.downto(-1) { |x|  @itemlist_window.index = x }
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 获取项目窗口中当前选定的数据
      @item = @itemlist_window.item
      # 非使用项目时
      unless @item.is_a?(RPG::Item)
        # 不能装备演奏冻结SE。
        unless @actor.can_equip?(@item)
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
         
          @tip.tip("你不能装备!")
         
          return
        end
        # 激活装备界面
        $game_system.se_play($data_system.decision_se)
        if @item.nil?
          @type = nil
        else
          @type = @item.is_a?(RPG::Weapon) ? 0 : @item.kind + 1
        end
        
        if @item != nil
          @item1 == @itemlist_window.item
        end
        
        # 关闭物品栏窗口
        @itemlist_window.active = false
        @right_window.index = @type.nil? ? 0 : @type
        # 打开装备栏窗口
        @right_window.active = true
        
        return
      end
      # 不可用时
      unless $game_party.item_can_use?(@item.id)
       # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        
        @tip.tip("你不能使用该物品!")
        
        return
      end
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 效果范围是我方的情况下
      if @item.scope >= 3
        # 激活目标窗口
        @itemlist_window.active = false
         # 调整物品画面使用对像角色选择的窗口位置
        @target_window.visible = true
        @target_window.active = true
         # 设置效果范围 (单体/全体) 的对应光标位置
        if @item.scope == 4 || @item.scope == 6
          @target_window.index = -1
        else
          @target_window.index = 0
        end
      # 效果在我方以外的情况下
      else
        # 公共事件 ID 有效的情况下
        if @item.common_event_id > 0
          # 预约调用公共事件
          $game_temp.common_event_id = @item.common_event_id
          # 演奏物品使用时的 SE
          $game_system.se_play(@item.menu_se)
          # 消耗品的情况下
            if @item.consumable
           # 使用的物品数减 1
              $game_party.lose_item(@item.id, 1)
             # 再描绘物品窗口的项目
              @itemlist_window.draw_item(@itemlist_window.index)
            end
          # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (目标窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_target
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
       # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
     # 由于物品用完而不能使用的场合
      unless $game_party.item_can_use?(@item.id)
        # 再次生成物品窗口的内容
        @itemlist_window.refresh
      end
      # 删除目标窗口
      @itemlist_window.active = true
      @target_window.visible = false
      @target_window.active = false
      @itemlist_window.set_item(@command_index)
      return
    end
      # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 如果物品用完的情况下
      if $game_party.item_number(@item.id) == 0
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        # 物品提示
        @tip.tip("物品已用完!")
        return
      end
     # 目标是全体的情况下
      if @target_window.index == -1
         # 对同伴全体应用物品使用效果
        used = false
        for i in $game_party.actors
          used |= i.item_effect(@item)
        end
      end
     # 目标是单体的情况下
      if @target_window.index >= 0
        # 对目标角色应用物品的使用效果
        target = $game_party.actors[@target_window.index]
        used = target.item_effect(@item)
      end
     # 使用物品的情况下
      if used
        # 演奏物品使用时的 SE
        $game_system.se_play(@item.menu_se)
       # 消耗品的情况下
        if @item.consumable
         # 使用的物品数减 1
          $game_party.lose_item(@item.id, 1)
          # 再描绘物品窗口的项目
          @itemlist_window.draw_item(@itemlist_window.index)
          @itemlist_window.set_item(@command_index)
               
          #如果使用后物品归零,则关闭Help_Window
          if $game_party.item_number(@item.id) == 0

            # 隐藏帮助窗口
            @help_window.visible = false
            # 删除目标窗口
            @target_window.visible = false
            @target_window.active  = false
            # 物品提示
            @tip.tip("物品已用完!")
            
            #这是为了让光标不要停留在空白处
            if @itemlist_window.index > 0
              @itemlist_window.index -= 1
            end

            # 激活物品窗口状态
            @itemlist_window.active = true
          end
         
        end
         # 再生成目标窗口的内容
        @target_window.refresh
        # 全灭的情况下
        if $game_party.all_dead?
        # 切换到游戏结束画面
          $scene = Scene_Gameover.new
          return
        end
        # 公共事件 ID 有效的情况下
        if @item.common_event_id > 0
         # 预约调用公共事件
          $game_temp.common_event_id = @item.common_event_id
           # 切换到地图画面
          $scene = Scene_Map.new
          return
        end
      end
      # 无法使用物品的情况下
      unless used
       # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        # 物品提示
        @tip.tip("你不能使用该物品!")
      end
    return
    end
  end
  # 刷新(角色装备)。
  def update_equip
      # 按下 B 键的情况下
    if Input.trigger?(Input::B)
        # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # #隐藏物品分类
      @itemlist_window.active = true
      # 隐藏装备栏窗口
      @right_window.active = false
      # 隐藏装备帮助窗口
      @help1_window.visible = false
      # 隐藏装备索引
      @right_window.index = -1
      return
    end
      # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      if @type != nil and @right_window.index != @type
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        # 物品提示
        @tip.tip("不能装备在这儿!")
        return
      end
      $game_system.se_play($data_system.equip_se)
      @actor.equip(@right_window.index, @item == nil ? 0 : @item.id)
      
      # 如果穿着后,装备归零,则关闭Help_Window
      if $game_party.item_number(@item1.id) == 0
        @help_window.visible = false
        # 物品窗口索引判定(这是为了让光标不要停留在空白处)
        if @itemlist_window.index > 0
        #  @itemlist_window.index -= 1
        end
        @item1 = nil
      end  

      # 索引=物品分类
      @itemlist_window.set_item(@command_index)
      # 刷新装备窗口
      @right_window.refresh
      # 关闭物品窗口激活状态
      @itemlist_window.active = true
      # 隐藏装备栏窗口
      @right_window.active = false
      # 隐藏装备帮助窗口
      @help1_window.visible = false
      # 隐藏装备索引
      @right_window.index = -1
    end
  end
end
[/pre]
梦石
0
星屑
4756
在线时间
389 小时
注册时间
2012-11-8
回帖
235
发表于 2022-7-29 09:04:38 | 显示全部楼层
你在测试的时候可以多多利用p xxx
比如这里可以在580行p @item1,弄清楚出错的时候@item1是个什么

点评

我试着p@item1。直接显示 nil 放在默认的游戏范例里没这问题的,放到Rgu的范例里就这样  发表于 2022-7-29 12:40
回复

使用道具 举报

梦石
0
星屑
3850
在线时间
1899 小时
注册时间
2010-6-19
回帖
917
 楼主| 发表于 2022-7-29 15:48:04 | 显示全部楼层
qq634488405 发表于 2022-7-29 09:04
你在测试的时候可以多多利用p xxx
比如这里可以在580行p @item1,弄清楚出错的时候@item1是个什么 ...

我直接把这段注释掉,然后好像没报错,这个影响大吗?

[pre lang="ruby"]=begin
# 如果穿着后,装备归零,则关闭Help_Window
      if $game_party.item_number(@item1.id) == 0
        @help_window.visible = false
        # 物品窗口索引判定(这是为了让光标不要停留在空白处)
        if @itemlist_window.index > 0
        #  @itemlist_window.index -= 1
        end
        @item1 = nil
      end  
=end[/pre]

点评

可能会出现装备后光标停在空白位置,并且help window不消失。help window里显示什么内容?  发表于 2022-7-30 08:52
回复

使用道具 举报

梦石
0
星屑
8003
在线时间
1184 小时
注册时间
2007-7-29
回帖
2014
发表于 2022-7-30 00:28:23 | 显示全部楼层
  1. if @item != nil and $game_party.item_number(@item1.id) == 0
复制代码
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部