Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Command window problems.

I'm trying to add a command window to Scene Item.

Problem is, it keeps starting in the item window and I keep getting anerror with the index

Heres the script

Code:
#==============================================================================
# â–  Scene_Item
#------------------------------------------------------------------------------
#  アイテム画面の処理を行うクラスです。
#==============================================================================

class Scene_Item
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------

  def main
    
      @background = Sprite.new
    @background.bitmap = RPG::Cache.picture("background9")
    @sprite1 = Sprite.new
    @sprite1.bitmap = RPG::Cache.picture("grad")
    @sprite1.z = 4
    @sprite2 = Sprite.new
    @sprite2.opacity = 160
    @viewport = Viewport.new(0, 0, 640, 480)
    @image = Plane.new(@viewport)
   @image.bitmap = RPG::Cache.picture("fog")
   @image.z = 3
   @image.opacity = 30
   
    @Display = Sprite.new
    @Display.bitmap = RPG::Cache.picture("Menu/" + "Items")
    
    
    # ヘルプウィンドウ、アイテムウィンドウを作成
    @help_window = Window_Help.new
    @item_window = Window_Item.new
    @item_Command_window = Window_Item_Command.new
    @item_Command_window.active = true
    @item_window.active = false
    @item_window.y =165
    @item_window.x = 20
    @item_window.width =335
    @item_window.height =300
    @item_window.opacity =0
    # ヘルプウィンドウを関連付け
    @item_window.help_window = @help_window
    # ターゲットウィンドウを作成 (不可視・非アクティブに設定)

    @target_window = Window_Target.new
    @target_window.visible = true
    @target_window.opacity = 0
    @target_window.x = 300
    @target_window.y = 66
    @target_window.height = 480
    @target_window.active = false
    # トランジション実行
    Graphics.transition
    # メインループ
    loop do
      # ゲーム画面を更新
      Graphics.update
      # 入力情報を更新
      Input.update
      # フレーム更新
      update
      # 画面が切り替わったらループを中断
      if $scene != self
        break
      end
    end
    # トランジション準備
    Graphics.freeze
    # ウィンドウを解放
    @help_window.dispose
    @item_window.dispose
    @item_Command_window.dispose
    @target_window.dispose
    @viewport.dispose
    @Display.dispose
        @background.dispose
    @sprite1.dispose
    @sprite2.dispose

  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # ウィンドウを更新

    @help_window.update
    @item_window.update
    @target_window.update
    # アイテムウィンドウがアクティブの場合: update_item を呼ぶ
       if @item_window.active
      update_item
      return
    end
    if @item_Command_window.active
      update_item_command
      return
    end
    # ターゲットウィンドウがアクティブの場合: update_target を呼ぶ
    if @target_window.active
      update_target
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (アイテムウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_item
        if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー画面に切り替え
     @Item_Command_window.active = true
      @item_window.active = false
          return
    end
    # C ボタンが押された場合
    if Input.trigger?(Input::C)
      # アイテムウィンドウで現在選択されているデータを取得
      @item = @item_window.item
      # 使用アイテムではない場合
      unless @item.is_a?(RPG::Item)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 使用できない場合
      unless $game_party.item_can_use?(@item.id)
        # ブザー SE を演奏
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      # 効果範囲が味方の場合
      if @item.scope >= 3
        # ターゲットウィンドウをアクティブ化
        @item_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)
            # アイテムウィンドウの項目を再描画
            @item_window.draw_item(@item_window.index)
          end
          # マップ画面に切り替え
          $scene = Scene_Map.new
          return
        end
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (ターゲットウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  def update_item_command
if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー画面に切り替え
     $scene=Scene_Menu.new(0)
      return
    end
      if Input.trigger?(Input::C)
        case @commands.index
        when 0
          $game_system.se_play($data_system.decision_se)
       @Item_Command.active = false
       @item_window.active = true
        when 1
          $game_system.se_play($data_system.decision_se)
        when 2
          $game_system.se_play($data_system.decision_se)
        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)
        # アイテムウィンドウの内容を再作成
        @item_window.refresh
      end
      # ターゲットウィンドウを消去
      @item_window.active = true
      @target_window.visible = true
      @target_window.active = false
      @item_command_window.active = false
      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)
        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)
          # アイテムウィンドウの項目を再描画
          @item_window.draw_item(@item_window.index)
        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)
      end
      return
    end
  end
end
end
 
sure

Code:
class Window_Item_Command < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #     width    : ウィンドウの幅
  #     commands : コマンド文字列の配列
  #--------------------------------------------------------------------------
# ------------------------------------
def initialize
   super(45, 60, 320, 80)
    self.contents = Bitmap.new(width - 32, height - 32)
    @item_max = 3
    @column_max = 3
    @commands = ["Use","Sort","Drop"]
    self.opacity = 0
    self.contents.font.size = 22
    refresh
    self.index = 0
  end
# ------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i)
    end
  end
# ------------------------------------ 
  def draw_item(index)
    x = 4 + index * 110
        self.contents.font.color = text_color(8)
    self.contents.draw_text(x+1, 0, 128, 32, @commands[index])
    self.contents.draw_text(x-1, 0, 128, 32, @commands[index])
    self.contents.draw_text(x, 1, 128, 32, @commands[index])
        self.contents.draw_text(x, -1, 128, 32, @commands[index])
            self.contents.font.color = normal_color
    self.contents.draw_text(x, 0, 128, 32, @commands[index])
  end
end
 
Add "self.active = false" in the initialize method of Window_Item_Command, so it won't start off as active. Make it become the active window by using "self.active = true".
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top