#◆◇◆◇◆ ☆ メニュー画面改造 ver 1.20 ◇◆◇◆◇ # ☆ マスタースクリプト ver 2.00 以降専用 # サポート掲示板 http://www2.ezbbs.net/21/minto-aaa/ # by みんと =begin 更新履歴 ver 1.20 バトラー以外の画像が使用できるように変更 ver 1.11 アイテムのアイコンが 表示されないミスを修正。 ver 1.10 他サイトさんの HP表示スクリプトが反映されないミスを修正。 説明 メニュー画面のレイアウトを改造します メニューを開いた際にはスライドアニメが実行され、 アイテム画面はメニュー画面で統括し、 アイテムウィンドウをシャッターウィンドウに変更し、 項目も自動で分類します。 ヘルプウィンドウは二行ウィンドウとなっており、 アイテムの説明文などは、半角のスペースで改行が実行されます。 =end #============================================================================== # ■ MINTO::RGSS #============================================================================== module MINTO # メニュー画面改造を有効化 ( true で有効 / false で無効 ) RGSS["minto_menu"] = true end if MINTO::RGSS["minto_menu"] #============================================================================== # ☆ カスタマイズ #============================================================================== module MINTO # 背景画像の名前(必要ない場合は nil # 背景をマップにしたいなら "Map" を収納する) Back_Picture = "Map" # 使用するグラの名前(アクターID順で記入。nil ならバトラーを使用) # ピクチャーフォルダを参照します # Graphic_Name[ID] = ファイル名 Graphic_Name = {} Graphic_Name[1] = nil Graphic_Name[2] = nil Graphic_Name[3] = nil Graphic_Name[4] = nil # ウィンドウの透明度 Opacity = 192 end #============================================================================== # ■ Window_Menu_Help #------------------------------------------------------------------------------ #  メニュー画面で項目や、アイテムの説明文を出すウィンドウです。 #============================================================================== class Window_Menu_Help < Window_Base #-------------------------------------------------------------------------- # ● メニュー画面のヘルプテキストの設定 #-------------------------------------------------------------------------- def setup_help_text_menu(index = 0) # インデックス(カーソル位置)によって分岐 case index # アイテム(index0)の場合 when 0 # 表示されるテキスト text = "所持品の閲覧や 使用を行います" # スキル(index1)の場合 when 1 text = "習得スキルの閲覧や 使用を行います" # 装備(index2)の場合 when 2 text = "装備品の閲覧や 変更を行います" # ステータス(index3)の場合 when 3 text = "メンバーの能力の 閲覧を行います" # セーブ(index4)の場合 when 4 text = "データの記録や 参照を行います" when 5 text = "ゲームを終了します" else text = "未設定の項目です" end # テキストを描写する return set_text(text.dup) end end #============================================================================== # ■ MINTO_Data #============================================================================== module MINTO_Data # セーブビットマップ初期化 @save_bitmap = {} #-------------------------------------------------------------------------- # ● セーブビットマップ(参照) #-------------------------------------------------------------------------- def self.save_bitmap return @save_bitmap end #-------------------------------------------------------------------------- # ● セーブビットマップ(変更) #-------------------------------------------------------------------------- def self.save_bitmap=(n) @save_bitmap = n end end #============================================================================== # ■ Scene_Menu #------------------------------------------------------------------------------ #  メニュー画面の処理を行うクラスです。 #============================================================================== class Scene_Menu #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :item_window # アイテムウィンドウ #-------------------------------------------------------------------------- # ● オブジェクト初期化 # menu_index : コマンドのカーソル初期位置 #-------------------------------------------------------------------------- def initialize(menu_index = 0, setup = true) @menu_index = menu_index @setup = setup end #-------------------------------------------------------------------------- # ● メイン処理 #-------------------------------------------------------------------------- def main # トランジション実行 Graphics.transition(1) # コマンドウィンドウを作成 @command_window = Window_MenuCommand.new @command_window.index = @menu_index # ゴールドウィンドウを作成 @gold_window = Window_Gold.new @gold_window.x = 480 @gold_window.y = 0 # プレイタイムウィンドウを作成 @thyme_window = Window_PlayTime.new # ステータスウィンドウを作成 @status_window = Window_MenuStatus2.new # ヘルプウィンドウを作成 @menu_help_window = Window_Menu_Help.new @menu_help_window.x = 0 @menu_help_window.y = 0 # アイテムウィンドウを作成 @item_window = Window_Menu_Item.new @item_window2 = Window_Menu_Item_Number.new # カテゴリーウィンドウを作成 @category_window = Window_Category.new # ターゲットウィンドウを作成 @target_window = Window_MenuTarget.new # 透明度を設定 opacity = MINTO::Opacity @gold_window.opacity = opacity @thyme_window.opacity = opacity @status_window.opacity = opacity @command_window.opacity = opacity @menu_help_window.opacity = opacity @item_window.opacity = opacity if @setup @command_window.height = -32 @status_width = @status_window.width.abs @status_window.width = 0 @gold_window.y = -40 @thyme_window.y = 6 @frame = 10 end # 背景グラフィックを作成 case MINTO::Back_Picture when nil when "Map" @sprite = Spriteset_Map.new else @sprite = Sprite.new @sprite.bitmap = RPG::Cache.title(MINTO::Back_Picture) end # メインループ loop do # ゲーム画面を更新 Graphics.update # 入力情報を更新 Input.update # フレーム更新 update # 画面が切り替わったらループを中断 if $scene != self break end end # トランジション準備 Graphics.freeze # ダミーリフレッシュ @command_window.refresh("ダミー") @menu_help_window.setup_help_text_menu(8) @item_window.refresh("ダミー") @item_window2.refresh("ダミー") # ウィンドウを解放 @thyme_window.dispose @menu_help_window.dispose @command_window.dispose @gold_window.dispose @status_window.dispose @item_window.dispose @item_window2.dispose @category_window.dispose @target_window.dispose @sprite.dispose end #-------------------------------------------------------------------------- # ● セットアップウィンドウ #-------------------------------------------------------------------------- def setup_window while @frame != 0 @command_window.height += 16 @status_window.width += @status_width / 10 @gold_window.y += 4 @thyme_window.y += 9 # ゲーム画面を更新 Graphics.update @frame -= 1 end end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # ウィンドウセットアップ if @setup setup_window end # スプライトを更新 @sprite.update # ウィンドウを更新 @thyme_window.update @item_window.update if @item_window.active @item_window2.update if @item_window.active @command_window.update if @command_window.active @status_window.update if @status_window.active @target_window.update if @target_window.active # コマンドウィンドウがアクティブの場合: update_command を呼ぶ if @command_window.active @menu_help_window.setup_help_text_menu(@command_window.index) update_command return end # ステータスウィンドウがアクティブの場合: update_status を呼ぶ if @status_window.active update_status return end # アイテムウィンドウがアクティブの場合: update_item を呼ぶ if @item_window.active if @item_window.item @menu_help_window.set_text(@item_window.item.description.dup) else @menu_help_window.set_text("") end update_item return end # ターゲットウィンドウがアクティブの場合: update_target を呼ぶ if @target_window.active update_target return end end #-------------------------------------------------------------------------- # ● フレーム更新 (コマンドウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_command # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play(Data_System.data.cancel_se) @category_window.refresh("ダミー") # マップ画面に切り替え $scene = Scene_Map.new return end # C ボタンが押された場合 if Input.trigger?(Input::C) # パーティ人数が 0 人で、セーブ、ゲーム終了以外のコマンドの場合 if $game_party.actors.size == 0 and @command_window.index < 4 # ブザー SE を演奏 $game_system.se_play(Data_System.data.buzzer_se) return end # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 0 # アイテム # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) # アイテムウィンドウをアクティブにする @command_window.active = false @item_window.active = true @item_window.height = -32 @item_window.visible = true @item_window2.height = -32 @item_window2.active = true @item_window2.visible = true @status_window.active = false @status_window.index = -1 frame = 10 while frame != 0 @item_window.height += 16 @item_window2.height += 16 # ゲーム画面を更新 Graphics.update frame -= 1 end @category_window.visible = true when 1 # スキル # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) # ステータスウィンドウをアクティブにする @command_window.active = false @status_window.active = true @status_window.index = 0 when 2 # 装備 # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) # ステータスウィンドウをアクティブにする @command_window.active = false @status_window.active = true @status_window.index = 0 when 3 # ステータス # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) # ステータスウィンドウをアクティブにする @command_window.active = false @status_window.active = true @status_window.index = 0 when 4 # セーブ # セーブ禁止の場合 if $game_system.save_disabled # ブザー SE を演奏 $game_system.se_play($data_system.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @category_window.refresh("ダミー") # セーブ画面に切り替え $scene = Scene_Save.new when 5 # ゲーム終了 # 決定 SE を演奏 $game_system.se_play($data_system.decision_se) @category_window.refresh("ダミー") # ゲーム終了画面に切り替え $scene = Scene_End.new end return end end #-------------------------------------------------------------------------- # ● フレーム更新 (ステータスウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_status # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play(Data_System.data.cancel_se) # コマンドウィンドウをアクティブにする @command_window.active = true @status_window.active = false @status_window.index = -1 return end # C ボタンが押された場合 if Input.trigger?(Input::C) # コマンドウィンドウのカーソル位置で分岐 case @command_window.index when 1 # スキル # このアクターの行動制限が 2 以上の場合 if $game_party.actors[@status_window.index].restriction >= 2 # ブザー SE を演奏 $game_system.se_play(Data_System.data.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) @category_window.refresh("ダミー") # スキル画面に切り替え $scene = Scene_Skill.new(@status_window.index) when 2 # 装備 # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) @category_window.refresh("ダミー") # 装備画面に切り替え $scene = Scene_Equip.new(@status_window.index) when 3 # ステータス # 決定 SE を演奏 $game_system.se_play(Data_System.data.decision_se) @category_window.refresh("ダミー") # ステータス画面に切り替え $scene = Scene_Status.new(@status_window.index) end return end end #-------------------------------------------------------------------------- # ● フレーム更新 (アイテムウィンドウがアクティブの場合) #-------------------------------------------------------------------------- def update_item # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play(Data_System.data.cancel_se) @category_window.visible = false frame = 10 while frame != 0 @item_window.height -= 16 @item_window2.height -= 16 # ゲーム画面を更新 Graphics.update frame -= 1 end # コマンドウィンドウをアクティブにする @command_window.active = true @item_window.active = false @item_window.visible = false @item_window2.active = false @item_window2.visible = false return end # → が 押された場合 if Input.trigger?(Input::RIGHT) if @item_window.category < 2 category = [@item_window.category + 1, 2].min else category = 0 end @item_window.index = 0 @item_window.refresh(category) @item_window2.index = 0 @item_window2.refresh(category) @category_window.refresh(category) end # ← が 押された場合 if Input.trigger?(Input::LEFT) if @item_window.category > 0 category = [@item_window.category - 1, 0].max else category = 2 end @item_window.index = 0 @item_window.refresh(category) @item_window2.index = 0 @item_window2.refresh(category) @category_window.refresh(category) end # C ボタンが押された場合 if Input.trigger?(Input::C) # アイテムウィンドウで現在選択されているデータを取得 @item = @item_window.item # 使用アイテムではない場合 unless @item.is_a?(RPG::Item) # ブザー SE を演奏 $game_system.se_play(Data_System::data.buzzer_se) return end # 使用できない場合 unless $game_party.item_can_use?(@item.id) # ブザー SE を演奏 $game_system.se_play(Data_System::data.buzzer_se) return end # 決定 SE を演奏 $game_system.se_play(Data_System::data.decision_se) # 効果範囲が味方の場合 if @item.scope >= 3 # ターゲットウィンドウをアクティブ化 @item_window.active = false @target_window.visible = true @target_window.active = true @category_window.visible = false # 効果範囲 (単体/全体) に応じてカーソル位置を設定 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_target # B ボタンが押された場合 if Input.trigger?(Input::B) # キャンセル SE を演奏 $game_system.se_play(Data_System::data.cancel_se) # アイテム切れなどで使用できなくなった場合 unless $game_party.item_can_use?(@item.id) # アイテムウィンドウの内容を再作成 @item_window.refresh end # ターゲットウィンドウを消去 @item_window.active = true @target_window.visible = false @target_window.active = false @category_window.visible = true 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.refresh(@item_window.category) @item_window2.refresh(@item_window.category, true) end # ステータスウィンドウの内容を再作成 @status_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::data.buzzer_se) end return end end end #============================================================================== # ■ Window_MenuStatus2 #------------------------------------------------------------------------------ #  メニュー画面でパーティメンバーのステータスを表示するウィンドウです。 #============================================================================== class Window_MenuStatus2 < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize width = $game_party.actors.size * 160 super(0, 290, width, 190) self.contents = Bitmap.new(width - 32, height - 32) @column_max = $game_party.actors.size refresh end #-------------------------------------------------------------------------- # ● 名前の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 #-------------------------------------------------------------------------- def draw_actor_name(actor, x, y) self.contents.font.color = normal_color draw_frame_text(x, y, 120, 32, actor.name) end #-------------------------------------------------------------------------- # ● 縁文字描写 #-------------------------------------------------------------------------- def draw_frame_text(x, y, width, height, text, ag = 0) # 元の色を保存 ori_color = self.contents.font.color.clone # 縁の色を定義 self.contents.font.color.set(0, 0, 0) # 縁文字を描写 self.contents.draw_text(x-1, y, width, height, text, ag) self.contents.draw_text(x+1, y, width, height, text, ag) self.contents.draw_text(x, y-1, width, height, text, ag) self.contents.draw_text(x, y+1, width, height, text, ag) # 元の色に戻す self.contents.font.color = ori_color # 本体の文字を描写 self.contents.draw_text(x, y, width, height, text, ag) end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear @item_max = $game_party.actors.size for i in 0...$game_party.actors.size actor = $game_party.actors[i] cursor_width = [self.width / @column_max - 32, 320].min x = i % @column_max * (cursor_width + 32) y = 0 draw_actor_battle_status(actor, x+4, y) end end #-------------------------------------------------------------------------- # ● バトラーグラフィックの描画 #-------------------------------------------------------------------------- def draw_battler_graphics(actor, x, y) if MINTO::Graphic_Name[actor.id] != nil battler = RPG::Cache.picture(MINTO::Graphic_Name[actor.id]) else battler = RPG::Cache.battler(actor.battler_name, actor.battler_hue) end # バトラーグラフィックを描画 self.contents.blt(x, y, battler, battler.rect) end #-------------------------------------------------------------------------- # ● アクターステータスの描写 #-------------------------------------------------------------------------- def draw_actor_battle_status(actor, x, y) draw_battler_graphics(actor, x, y+4) draw_actor_name(actor, x, y) draw_actor_hp(actor, x, y + 96, 96) draw_actor_sp(actor, x, y + 128, 96) end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + (self.page_row_max - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - (self.page_row_max - 1) end # カーソルの幅を計算 cursor_width = [self.width / @column_max - 32, 320].min # カーソルの座標を計算 x = @index % @column_max * (cursor_width + 32) y = @index / @column_max * 32 - self.oy # カーソルの矩形を更新 self.cursor_rect.set(x, y, cursor_width, self.height - 32) end end #============================================================================== # ■ Window_MenuTarget #------------------------------------------------------------------------------ #  メニュー画面でパーティメンバーのステータスを表示するウィンドウです。 #============================================================================== class Window_MenuTarget < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize width = $game_party.actors.size * 160 super(0, 290, width, 190) self.contents = Bitmap.new(width - 32, height - 32) self.active = false self.z -= 1 self.opacity = 0 @column_max = $game_party.actors.size @item_max = $game_party.actors.size end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + (self.page_row_max - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - (self.page_row_max - 1) end # カーソルの幅を計算 cursor_width = [self.width / @column_max - 32, 320].min # カーソルの座標を計算 x = @index % @column_max * (cursor_width + 32) y = @index / @column_max * 32 - self.oy # カーソルの矩形を更新 self.cursor_rect.set(x, y, cursor_width, self.height - 32) end end #============================================================================== # ■ Window_Menu_Item #------------------------------------------------------------------------------ #  メニュー画面で、所持アイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_Menu_Item < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :scroll # スクロールバー attr_reader :category # カテゴリー #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 96, 320, 160) @column_max = 1 @category = 0 refresh self.index = 0 self.active = false self.z += 10 self.visible = false end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(category = 0) @category = category @data = [] name = [] # 描写するアイテムの取得 get_data_of_draw_items(category) # 項目数が 0 でなければビットマップを作成し、全項目を描画 @item_max = @data.size for item in @data if item name.push(item.name) end end # まだ、未作成のビットマップなら作成する if !MINTO_Data.save_bitmap[name] if @item_max > 0 bitmap = Bitmap.new(width - 32, row_max * 32) for index in 0...@item_max item = @data[index] # 渡されたデータがアイテムで、かつそのアイテムが使えるか if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id) bitmap.font.color = normal_color # そのアイテムが使えない。又は、それ以外の装備品等なら else bitmap.font.color = disabled_color end x = 2 + index % @column_max * (288 + 32) y = (index / @column_max * 32) rect = Rect.new(x, y, self.width / @column_max - 32, 32) bitmap.fill_rect(rect, Color.new(0, 0, 0, 0)) bit = RPG::Cache.icon(item.icon_name) opacity = bitmap.font.color == normal_color ? 255 : 128 bitmap.blt(x, y + 4, bit, Rect.new(0, 0, 24, 24), opacity) bitmap.draw_text(x + 32, y, 160, 32, item.name) bitmap.draw_text(x, y, 192, 32, ":", 2) end else bitmap = Bitmap.new(width - 32, 64) end MINTO_Data.save_bitmap[name] = bitmap end self.contents = MINTO_Data.save_bitmap[name] end #-------------------------------------------------------------------------- # ● 描写するアイテムの取得 @data #-------------------------------------------------------------------------- def get_data_of_draw_items(category) # アイテムを追加 case category when 0 set_own_item_data when 1 set_own_weapon_data when 2 set_own_armor_data else @data = [] end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上のアイテムを @data に返す #-------------------------------------------------------------------------- def set_own_item_data for i in 1...Data_Items.data.size if $game_party.item_number(i) > 0 @data.push(Data_Items.data[i]) end end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上の武器を @data に返す #-------------------------------------------------------------------------- def set_own_weapon_data for i in 1...Data_Weapons.data.size if $game_party.weapon_number(i) > 0 @data.push(Data_Weapons.data[i]) end end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上の防具を @data に返す #-------------------------------------------------------------------------- def set_own_armor_data for i in 1...Data_Armors.data.size if $game_party.armor_number(i) > 0 @data.push(Data_Armors.data[i]) end end end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + ((self.page_row_max) - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - ((self.page_row_max) - 1) end # カーソルの幅を計算 if @data[@index] width = self.contents.text_size(@data[@index].name).width else width = 8 end cursor_width = [width + 4, 160].min # カーソルの座標を計算 x = @index % @column_max * (cursor_width + 64) y = (@index / @column_max * 32 - self.oy) # カーソルの矩形を更新 self.cursor_rect.set(x + 32, y, cursor_width, 32) end end #============================================================================== # ■ Window_Menu_Item_Number #------------------------------------------------------------------------------ #  メニュー画面で、所持アイテムの個数を表示するウィンドウです。 #============================================================================== class Window_Menu_Item_Number < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :scroll # スクロールバー attr_reader :category # カテゴリー attr_accessor :forcing # 強制フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 96, 320, 160) @column_max = 1 @category = 0 refresh self.index = 0 self.active = false self.visible = false self.opacity = 0 self.z += 10 end #-------------------------------------------------------------------------- # ● アイテムの取得 #-------------------------------------------------------------------------- def item return @data[self.index] end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(category = 0, forcing = false) @forcing = forcing @category = category @data = [] name = [] # 描写するアイテムの取得 get_data_of_draw_items(category) # 項目数が 0 でなければビットマップを作成し、全項目を描画 @item_max = @data.size for item in @data if item case item when RPG::Item number = $game_party.item_number(item.id) when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) end name.push(item.name + number.to_s) end end # まだ、未作成のビットマップなら作成する if !MINTO_Data.save_bitmap[name] || @forcing @forcing = false if @item_max > 0 bitmap = Bitmap.new(width - 32, row_max * 32) for index in 0...@item_max item = @data[index] case item when RPG::Item number = $game_party.item_number(item.id) when RPG::Weapon number = $game_party.weapon_number(item.id) when RPG::Armor number = $game_party.armor_number(item.id) end # 渡されたデータがアイテムで、かつそのアイテムが使えるか if item.is_a?(RPG::Item) and $game_party.item_can_use?(item.id) bitmap.font.color = normal_color # そのアイテムが使えない。又は、それ以外の装備品等なら else bitmap.font.color = disabled_color end x = 2 + index % @column_max * (288 + 32) y = (index / @column_max * 32) bitmap.draw_text(x, y, 224, 32, number.to_s, 2) end else bitmap = Bitmap.new(width - 32, 64) end MINTO_Data.save_bitmap[name] = bitmap end self.contents = MINTO_Data.save_bitmap[name] end #-------------------------------------------------------------------------- # ● 描写するアイテムの取得 @data #-------------------------------------------------------------------------- def get_data_of_draw_items(category) # アイテムを追加 case category when 0 set_own_item_data when 1 set_own_weapon_data when 2 set_own_armor_data else @data = [] end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上のアイテムを @data に返す #-------------------------------------------------------------------------- def set_own_item_data for i in 1...Data_Items.data.size if $game_party.item_number(i) > 0 @data.push(Data_Items.data[i]) end end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上の武器を @data に返す #-------------------------------------------------------------------------- def set_own_weapon_data for i in 1...Data_Weapons.data.size if $game_party.weapon_number(i) > 0 @data.push(Data_Weapons.data[i]) end end end #-------------------------------------------------------------------------- # ● 所有数が 1 以上の防具を @data に返す #-------------------------------------------------------------------------- def set_own_armor_data for i in 1...Data_Armors.data.size if $game_party.armor_number(i) > 0 @data.push(Data_Armors.data[i]) end end end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect # カーソル位置が 0 未満の場合 if @index < 0 self.cursor_rect.empty return end # 現在の行を取得 row = @index / @column_max # 現在の行が、表示されている先頭の行より前の場合 if row < self.top_row # 現在の行が先頭になるようにスクロール self.top_row = row end # 現在の行が、表示されている最後尾の行より後ろの場合 if row > self.top_row + ((self.page_row_max) - 1) # 現在の行が最後尾になるようにスクロール self.top_row = row - ((self.page_row_max) - 1) end # カーソルの幅を計算 if @data[@index] width = self.contents.text_size(@data[@index].name).width else width = 8 end cursor_width = [width + 4, 320].min # カーソルの座標を計算 x = @index % @column_max * (cursor_width + 64) y = (@index / @column_max * 32 - self.oy) # カーソルの矩形を更新 self.cursor_rect.set(x, y, 0, 0) end end #============================================================================== # ■ Window_MenuCommand #------------------------------------------------------------------------------ #  メニュ画面で、コマンドを選択するウィンドウです。 #============================================================================== class Window_MenuCommand < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 96, 320, 128) s1 = Data_System.data.words.item s2 = Data_System.data.words.skill s3 = Data_System.data.words.equip s4 = "ステータス" s5 = "セーブ" s6 = "ゲーム終了" @commands = [s1, s2, s3, s4, s5, s6] @item_max = 6 @column_max = 2 refresh self.index = 0 end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(name = "Menu") if !MINTO_Data.save_bitmap[name] bitmap = Bitmap.new(width - 32, height - 32) for index in 0...@commands.size x = ((@column_max + index % @column_max) - 2) * 160 y = index / @column_max * 32 bitmap.draw_text(x, y, 128, 32, @commands[index], 1) end MINTO_Data.save_bitmap[name] = bitmap end self.contents = MINTO_Data.save_bitmap[name] end end #============================================================================== # ■ Window_Category #------------------------------------------------------------------------------ #  メニュー画面で、カテゴリーリストを表示するウィンドウです。 #============================================================================== class Window_Category < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 224, 320, 64) self.contents = Bitmap.new(width - 32, height - 32) self.opacity = 190 self.visible = false self.z += 1 refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh(name = "カテゴリー") case $scene.item_window.category when 0 category = "アイテム" when 1 category = "武器" when 2 category = "防具" end if !MINTO_Data.save_bitmap[name.to_s + category] x = 0 bitmap = Bitmap.new(width - 32, height - 32) bitmap.font.color = system_color bitmap.draw_text(x, 0, self.width - 32, 32, "←") bitmap.draw_text(x, 0, self.width - 32, 32, category, 1) bitmap.draw_text(x, 0, self.width - 32, 32, "→", 2) MINTO_Data.save_bitmap[name.to_s + category] = bitmap end self.contents = MINTO_Data.save_bitmap[name.to_s + category] end end #============================================================================== # ■ Window_PlayTime #------------------------------------------------------------------------------ #  メニュー画面でプレイ時間を表示するウィンドウです。 #============================================================================== class Window_PlayTime < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(480, 96, 160, 64) self.contents = Bitmap.new(width - 32, height - 32) refresh end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh self.contents.clear self.contents.font.color = system_color self.contents.draw_text(0, 0, 128, 32, "時間") @total_sec = Graphics.frame_count / Graphics.frame_rate hour = @total_sec / 60 / 60 min = @total_sec / 60 % 60 text = sprintf("%02d:%02d", hour, min) self.contents.font.color = normal_color self.contents.draw_text(0, 0, 128, 32, text, 2) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super if Graphics.frame_count / Graphics.frame_rate != @total_sec refresh end end end #============================================================================== # ■ Window_Menu_Help #------------------------------------------------------------------------------ #  メニュー画面で項目や、アイテムの説明文を出すウィンドウです。 #============================================================================== class Window_Menu_Help < Window_Base #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(320, 0, 320, 96) self.contents = Bitmap.new(width - 32, height - 32) end #-------------------------------------------------------------------------- # ● テキスト設定 # text : ウィンドウに表示する文字列 # align : アラインメント (0..左揃え、1..中央揃え、2..右揃え) #-------------------------------------------------------------------------- def set_text(text) return if !text # テキストが前回と違っている場合 if @last_text != text @last_text = text # テキストを再描画 self.contents.clear self.contents.font.color = normal_color width = self.width - 32 # 改行の判定文字 split = " " # テキストデータ設定 data = text.dup text1 = data.split(/#{split}/)[0].to_s text2 = data.split(/#{split}/)[1].to_s text_width = self.contents.text_size(text1).width text_width1 = self.contents.text_size(text2).width height_p = 16 height_p -= 16 if text2 != "" x = 0 y = height_p # 文字を描画 self.contents.draw_text(x, y, width, 32, text1, 1) self.contents.draw_text(x, y + 32, width, 32, text2, 1) end self.visible = true end end end