| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 6 |  
| 积分 | 1 |  
| 经验 | 1798 |  
| 最后登录 | 2013-11-16 |  
| 在线时间 | 138 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间138 小时注册时间2008-11-28帖子73 | 
| 本帖最后由 dancy60634 于 2011-11-8 21:54 编辑 
 http://www4.plala.or.jp/findias/ ... vx_rgss2/index.html复制代码#==============================================================================
# ■ VX-RGSS-22 アイテム画面-改 [Ver.1.0.0]            by Claimh
#------------------------------------------------------------------------------
# アイテム画面(戦闘以外)を改変します。
#------------------------------------------------------------------------------
# ◆アイテム分類
#   アイテム : 通常アイテム
#   装備品   : 武器・防具
#   貴重品   : 価格=0のアイテム
# ◆捨てる
#   Xボタンでアイテムを捨てることができます。
#==============================================================================
module ItemEx
  # アイテム分類で貴重品の項を使用する
  USE_PRECIAS = true
  
  # 捨てるあり
  USE_LOSE = true
  
  # 貴重品の放棄を許可する
  USE_LOSE_PRE = true
end
#==============================================================================
# ■ ItemExData
#------------------------------------------------------------------------------
# RPG::Item/Weapon/Armor用の共通クラス
#==============================================================================
class ItemExData
  # 初期化
  def initialize(d)
    @item = d
  end
  # RPG::Item/Weapon/Armorデータ参照
  def d
    return @item
  end
  # アイテム所持数
  def number
    return $game_party.item_number(@item)
  end
  # アイテム破棄
  def lose(n)
    $game_party.lose_item(@item, n)
  end
  # アイテム使用可能?
  def can_use?
    case @item
    when RPG::Item;   return $game_party.item_can_use?(@item)
    when RPG::Weapon; return false
    when RPG::Armor;  return false
    end
  end
  # アイテム破棄可能?
  def can_lose?
    return (ItemEx::USE_LOSE_PRE or @item.price != 0)
  end
end
#==============================================================================
# ■ Window_ItemCmd
#==============================================================================
class Window_ItemCmd < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, WLH+32, 544, WLH+32)
    @commands = ["アイテム", "装備品"]
    @commands.push("貴重品") if ItemEx::USE_PRECIAS
    @item_max = @column_max = @commands.size
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #     index : 項目番号
  #--------------------------------------------------------------------------
  def draw_item(index)
    rect = item_rect(index)
    rect.x += 4
    rect.width -= 8
    self.contents.draw_text(rect.x, 0, rect.width, WLH, @commands[index])
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.ct = @index
  end
end
#==============================================================================
# ■ Window_ItemList
#==============================================================================
class Window_ItemList < Window_Selectable
  MAX = ItemEx::USE_PRECIAS ? 3 : 2
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 112, 544, 306)
    @column_max = 2
    @index = 0
    @idx = [0, 0, 0]
    @ct = 0
    all_refresh
    self.ct = @ct
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    super
    for b in @bitmap
      b.dispose unless b.nil?
    end
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ内容の作成
  #--------------------------------------------------------------------------
  def create_contents
  end
  #--------------------------------------------------------------------------
  # ● カテゴリ変更
  #--------------------------------------------------------------------------
  def ct=(c)
    save_idx
    @ct = c
    self.contents = @bitmap[c]
    @item_max = @data[c].size
    @idx[c] = @item_max - 1 if @idx[c] >= @item_max
    @idx[c] = 0 if @idx[c] < 0
    load_idx
  end
  #--------------------------------------------------------------------------
  # ● index保存
  #--------------------------------------------------------------------------
  def save_idx
    @idx[@ct] = self.index
  end
  def load_idx
    self.index = @idx[@ct]
  end
  #--------------------------------------------------------------------------
  # ● アイテムの取得
  #--------------------------------------------------------------------------
  def item
    return i_item(@index)
  end
  def i_item(i)
    return @data[@ct][i]
  end
  #--------------------------------------------------------------------------
  # ● 全リフレッシュ
  #--------------------------------------------------------------------------
  def all_refresh
    @bitmap = []
    @data = []
    for c in 0...MAX
      data_refresh(c)
    end
  end
  #--------------------------------------------------------------------------
  # ● データリフレッシュ
  #--------------------------------------------------------------------------
  def data_refresh(c)
    @data[c] = []
    for d in $game_party.items
      case c
      when 0  # アイテム
        next if !d.is_a?(RPG::Item)
        next if ItemEx::USE_PRECIAS and d.price == 0
        @data[c].push(ItemExData.new(d))
      when 1  # 武器防具
        next if !d.is_a?(RPG::Weapon) and !d.is_a?(RPG::Armor)
        @data[c].push(ItemExData.new(d))
      when 2  # 貴重品
        next if !d.is_a?(RPG::Item)
        next if !ItemEx::USE_PRECIAS or d.price != 0
        @data[c].push(ItemExData.new(d))
      end
      if d.is_a?(RPG::Item) and d.id == $game_party.last_item_id
        @idx[c] = @data[c].size - 1
        load_idx if @ct == c
      end
    end
    @bitmap[c].dispose unless @bitmap[c].nil?
    @item_max = @data[c].size
    @bitmap[c] = Bitmap.new(width - 32, @item_max > 0 ? (row_max*WLH) : WLH)
    refresh(c)
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh(c)
    self.ct = c
    for i in 0...@item_max
      draw_item(i, false)
    end
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(i, clear=true)
    itm = i_item(i)
    rect = item_rect(i)
    x = rect.x + 4
    y = rect.y
    if clear
      self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    end
    rect.width -= 4
    draw_item_name(itm.d, rect.x, rect.y, itm.can_use?)
    self.contents.draw_text(rect, sprintf(":%2d", itm.number), 2)
  end
  #--------------------------------------------------------------------------
  # ● ヘルプテキスト更新
  #--------------------------------------------------------------------------
  def update_help
    @help_window.set_text(self.item == nil ? "" : self.item.d.description)
  end
end
#==============================================================================
# ■ Window_ItemNumber
#==============================================================================
class Window_ItemNumber < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     x : ウィンドウの X 座標
  #     y : ウィンドウの Y 座標
  #--------------------------------------------------------------------------
  def initialize(x, y)
    super(x, y, 300, WLH*2 + 32)
    @item = nil
    @max = 1
    @number = 1
    self.visible = false
    self.z += 10
    self.opacity = 200
  end
  #--------------------------------------------------------------------------
  # ● アイテム、最大個数の設定
  #--------------------------------------------------------------------------
  def set(item, max)
    @item = item
    @max = max
    @number = 1
    self.visible = true
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 入力された個数の設定
  #--------------------------------------------------------------------------
  def number
    return @number
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.draw_text(0, 0, 200, WLH, "捨てる数:")
    draw_item_name(@item, 4, WLH)
    self.contents.font.color = normal_color
    self.contents.draw_text(212, WLH, 20, WLH, "×")
    self.contents.draw_text(244, WLH, 20, WLH, @number.to_s, 2)
    self.cursor_rect.set(240, WLH, 28, WLH)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if self.active
      last_number = @number
      if Input.repeat?(Input::RIGHT) and @number < @max
        @number += 1
      end
      if Input.repeat?(Input::LEFT) and @number > 1
        @number -= 1
      end
      if Input.repeat?(Input::UP) and @number < @max
        @number = [@number + 10, @max].min
      end
      if Input.repeat?(Input::DOWN) and @number > 1
        @number = [@number - 10, 1].max
      end
      if @number != last_number
        Sound.play_cursor
        refresh
      end
    end
  end
end
#==============================================================================
# ■ Scene_Item
#------------------------------------------------------------------------------
#  アイテム画面の処理を行うクラスです。
#==============================================================================
class Scene_Item < Scene_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(index=0)
    @index = index
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_menu_background
    @viewport = Viewport.new(0, 0, 544, 416)
    @cmd_window  = Window_ItemCmd.new
    @cmd_window.viewport = @viewport
    @item_window = Window_ItemList.new
    @item_window.viewport = @viewport
    @num_window  = Window_ItemNumber.new(122, 200)
    @help_window = Window_Help.new
    @help_window.viewport = @viewport
    @target_window = Window_MenuStatus.new(0, 0)
    hide_target_window
    #
    @target_window.visible = @target_window.active = false
    @item_window.active = false
    @num_window.active = false
    @item_window.help_window = @help_window
    @cmd_window.help_window  = @item_window
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_menu_background
    @viewport.dispose
    @cmd_window.dispose
    @item_window.dispose
    @num_window.dispose
    @help_window.dispose
    @target_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 元の画面へ戻る
  #--------------------------------------------------------------------------
  def return_scene
    $scene = Scene_Menu.new(@index)
  end
  #----------------------------------------------------------------------------
  # ● フレーム更新
  #----------------------------------------------------------------------------
  def update
    if @cmd_window.active
      update_cmd
    elsif @item_window.active
      update_list
    elsif @num_window.active
      update_num
    elsif @target_window.active
      update_target
    end
  end
  #----------------------------------------------------------------------------
  # ● フレーム更新 : cmd
  #----------------------------------------------------------------------------
  def update_cmd
    @cmd_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      return_scene
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @cmd_window.active = false
      @item_window.active = true
    end
  end
  #----------------------------------------------------------------------------
  # ● フレーム更新 : list
  #----------------------------------------------------------------------------
  def update_list
    @item_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @cmd_window.active = true
      @item_window.active = false
      @help_window.set_text("")
    elsif Input.trigger?(Input::C)
      if @item_window.item.nil? or !@item_window.item.can_use?
        Sound.play_buzzer
        return
      end
      @item = @item_window.item.d
      if @item != nil
        $game_party.last_item_id = @item.id
      end
      if $game_party.item_can_use?(@item)
        Sound.play_decision
        determine_item
      else
        Sound.play_buzzer
      end
    elsif Input.trigger?(Input::X) and ItemEx::USE_LOSE
      if @item_window.item.nil? or !@item_window.item.can_lose?
        Sound.play_buzzer
        return
      end
      Sound.play_decision
      @item = @item_window.item
      @num_window.set(@item.d, @item.number)
      @item_window.active = false
      @num_window.visible = @num_window.active = true
    end
  end
  #----------------------------------------------------------------------------
  # ● フレーム更新 : num
  #----------------------------------------------------------------------------
  def update_num
    @num_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      @item_window.active = true
      @num_window.visible = @num_window.active = false
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      @item.lose(@num_window.number)
      if @item.number > 0
        @item_window.draw_item(@item_window.index, true)
      else
        @item_window.data_refresh(@cmd_window.index)
        $game_party.last_item_id = 0
      end
      @item_window.active = true
      @num_window.visible = @num_window.active = false
    end
  end
  #--------------------------------------------------------------------------
  # ● ターゲット選択の更新
  #--------------------------------------------------------------------------
  def update_target
    @target_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      if $game_party.item_number(@item) == 0    # アイテムを使い切った場合
        @item_window.data_refresh(@cmd_window.index) # ウィンドウの内容を再作成
      end
      hide_target_window
    elsif Input.trigger?(Input::C)
      if not $game_party.item_can_use?(@item)
        Sound.play_buzzer
      else
        determine_target
      end
    end
  end
end
看看合不合用
 | 
 |