=begin #======================================================================= ☆★アイテムのページ管理スクリプト  ▽アイテムが多くて画面に入りきらない場合の処理を、   スクロールではなくて、完全にページを分けて行います。  ●メリット   アイテムの所持数が680超程になると、   表示ビットマップのサイズを超えてしまい、エラー落ちしてしまいますが、   ページに入りきらない分は画像として生成しませんので、   エラー落ちしなくなります。   また、ページ数を表示することによって、   ユーザーが多数のアイテムを管理しやすくなります。  ※ かなり基礎に関わる再定義が多い素材ですので、    導入は素材最上部にお願いします。 履歴 2010/11/01 アイテムを使用したときに謎の表示が出るバグを修正。 2010/08/03 装備などで、ページのデータが無くなると起こるエラーを修正。 2010/07/24 公開開始。 製作:P.A.E : Creava 素材の二次配布はご遠慮下さい。 =end #========================================================================= #☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ # カスタマイズここから #☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ #ページ数の表示 page 1/5 の page の表記 PageTxt = "page" # " "で囲うのを忘れないように。 #表示する切り替え方法の表記を変更できます Page_Change_Txt = "[L・Rでページ切り替え]" # " "で囲うのを忘れないように。 #文字の色を設定できます。文章の表示で使用可能な \c[] 命令と同じ色指定になります。 Txt_Color = 14 #☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ # カスタマイズここまで #☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆ # 参考 # ● エイリアスを使った、元の処理を生かした再定義です # ○ 新たに加えた独自の処理です # ▼ 以前の処理を無視して新たに再定義を行った項目です #   導入の際は▼によって競合が最も起こりやすいので気をつけて下さい。 #============================================================================== # ■ Window_Item #------------------------------------------------------------------------------ #  アイテム画面などで、所持アイテムの一覧を表示するウィンドウです。 #============================================================================== class Window_Item < Window_Selectable #-------------------------------------------------------------------------- # ● オブジェクト初期化 # x : ウィンドウの X 座標 # y : ウィンドウの Y 座標 # width : ウィンドウの幅 # height : ウィンドウの高さ #-------------------------------------------------------------------------- alias p_a_e_item_paging_initialize initialize unless $@ def initialize(x, y, width, height) # 新たに使用する変数を初期化 @page = 0 #現在ページ数 @page_max = 0 #最大ページ数 @all_data = [] #ページごとのアイテムデータが格納された、総合データ # 以前の処理をそのまま実行 p_a_e_item_paging_initialize(x, y, width, height) end #-------------------------------------------------------------------------- # ○ 1 ページ後ろに移動 #-------------------------------------------------------------------------- def pagedown # 1ページで収まっているならば、処理せず戻る return if self.max_page? <= 1 # 最後のページならば、最初のページに戻す if @page == (self.max_page? - 1) @page = 0 return end #ページ数を1増やす という通常の処理 @page += 1 if @page < (self.max_page? - 1) end #-------------------------------------------------------------------------- # ○ 1 ページ前に移動 #-------------------------------------------------------------------------- def pageup # 1ページで収まっているならば、処理せず戻る return if self.max_page? <= 1 #ページ数を1減らす という通常の処理 @page -= 1 #最初のページならば、最後のページに飛ばす @page = @page_max - 1 if @page < 0 end #-------------------------------------------------------------------------- # ▼ アイテムの取得 (再定義) #-------------------------------------------------------------------------- def item # リフレッシュ前は総合データの中身が無いので、 # 前の処理ができるようにして、エラーの発生を防ぐ、とりあえず的な処理 # もっとウマいやり方もあるんでしょうけど(汗 if @all_data == [] return @data[self.index] else return @all_data[@page][self.index] end end #-------------------------------------------------------------------------- # ○ アイテムの、指定したページでの最大数を取得 #-------------------------------------------------------------------------- def item_max? return 0 if @all_data == [] # エラー防止 return @all_data[@page].size end #-------------------------------------------------------------------------- # ○ max_ページ数の取得 データが無い時は0を返す #-------------------------------------------------------------------------- def max_page? return 0 if @all_data == [] # エラー防止 return @all_data.size unless @all_data.empty? end #-------------------------------------------------------------------------- # ○ 現在のページ数を返す #-------------------------------------------------------------------------- def page return @page if @page != nil end #-------------------------------------------------------------------------- # ▼ リフレッシュ #-------------------------------------------------------------------------- def refresh # 初期化 @data = [] # ページごとのアイテムデータ @all_data = [] # 全てのページのデータが入った総合データ #パーティが所持するアイテムの処理 for item in $game_party.items # アイテムが含まれていなかったら次へ next unless include?(item) # ページごとのデータにアイテムデータを挿入 @data.push(item) # もし、装備画面なら、装備を外す項目を確保するためにも、 # 最後の一つを空欄にする if $scene.is_a?(Scene_Equip) && (@data.size == (self.page_item_max - 1)) @data.push(nil) if include?(nil) end # ページ内が一杯になったら、そのページデータを総合データに挿入し、 # ページデータを初期化して処理を続ける if @data.size == self.page_item_max @all_data.push(@data) @data =[] end end # 最後のページデータも、総合データに挿入する # 単一のページのデータも、ここで総合データに組み込まれる @all_data.push(@data) if @data != [] # カーソル位置を一番先頭に self.index = 0 # 最後の一個は空欄にしておく @data.push(nil) if include?(nil) # 装備などの関係で、ページ内のデータが消えた場合、 # 前のページに戻してエラーを防ぐ @page -= 1 if (@all_data[@page] == nil) && (@page > 0) # 現在のページでの最大数を取得 @item_max = self.item_max? #ページの最大数を取得 @page_max = @all_data.size # 表示項目初期化 create_contents # 表示のずれを直すため、ページごとの何個目か、という変数を作っておく # 総合データ内で何番目か? だとカーソルがとんでもない位置に(笑 @times = 0 # データが存在するなら、1ページ分のデータを表示させる if @all_data != [] @all_data[@page].each {|i| @p_item = i draw_item(i.id) @times += 1 } end # ページを切り替えるインフォメーションの表示 # 単一ページで収まっているなら表示させない if @page_max <= 1 text = "" else text = (PageTxt + (@page + 1).to_s + "/" + (@page_max).to_s + " " + Page_Change_Txt) end # フォントサイズ指定 self.contents.font.size = 14 # フォントカラー指定 self.contents.font.color = text_color(Txt_Color) # 実際に表示 self.contents.draw_text(4, -6, 256, 24,text) end #-------------------------------------------------------------------------- # ▼ カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if @index < 0 # カーソル位置が 0 未満の場合 self.cursor_rect.empty # カーソルを無効とする else # カーソル位置が 0 以上の場合 row = @index / @column_max # 現在の行を取得 if row < top_row # 表示されている先頭の行より前の場合 self.top_row = row # 現在の行が先頭になるようにスクロール end if row > bottom_row # 表示されている末尾の行より後ろの場合 self.bottom_row = row # 現在の行が末尾になるようにスクロール end rect = item_rect(@index) # 選択されている項目の矩形を取得 # ↓これを少しずらして、インフォメーションのスペースを確保 rect.y -= self.oy - 13 # 矩形をスクロール位置に合わせる self.cursor_rect = rect # カーソルの矩形を更新 end end #-------------------------------------------------------------------------- # ▼ 項目の描画 # index : 項目番号 #-------------------------------------------------------------------------- def draw_item(index) rect = item_rect(@times) # ページの中で何個目か、という処理に変更 rect.y += 13 # これも少しずらして、インフォメーションのスペースを確保 self.contents.clear_rect(rect) item = @p_item if item != nil number = $game_party.item_number(item) enabled = enable?(item) rect.width -= 4 draw_item_name(item, rect.x, rect.y, enabled) self.contents.draw_text(rect, sprintf(":%2d", number), 2) end end end #============================================================================== # ■ Scene_Item #------------------------------------------------------------------------------ #  アイテム画面の処理を行うクラスです。 #============================================================================== class Scene_Item < Scene_Base #-------------------------------------------------------------------------- # ● アイテム選択の更新 #-------------------------------------------------------------------------- alias p_a_e_item_paging_update_item_selection update_item_selection unless $@ def update_item_selection # L・Rでページ切り替えするように if Input.trigger?(Input::L) @item_window.pageup @item_window.refresh elsif Input.trigger?(Input::R) @item_window.pagedown @item_window.refresh else p_a_e_item_paging_update_item_selection end end #-------------------------------------------------------------------------- # ● アイテムの使用 (味方対象以外の使用効果を適用) #-------------------------------------------------------------------------- alias p_a_e_use_item_nontarget use_item_nontarget def use_item_nontarget p_a_e_use_item_nontarget @item_window.refresh end end #============================================================================== # ■ Scene_Shop #------------------------------------------------------------------------------ #  ショップ画面の処理を行うクラスです。 #============================================================================== class Scene_Shop < Scene_Base #-------------------------------------------------------------------------- # ● 売却アイテム選択の更新 #-------------------------------------------------------------------------- alias p_a_e_item_paging_update_sell_selection update_sell_selection unless $@ def update_sell_selection # L・Rでページ切り替えするように if Input.trigger?(Input::L) @sell_window.pageup @sell_window.refresh elsif Input.trigger?(Input::R) @sell_window.pagedown @sell_window.refresh else p_a_e_item_paging_update_sell_selection end end end #============================================================================== # ■ Scene_Equip #------------------------------------------------------------------------------ #  装備画面の処理を行うクラスです。 #============================================================================== class Scene_Equip < Scene_Base #-------------------------------------------------------------------------- # ● アイテム選択の更新 #-------------------------------------------------------------------------- alias p_a_e_item_paging_update_eqitem_selection update_item_selection unless $@ def update_item_selection # L・Rでページ切り替えするように if Input.trigger?(Input::L) @item_window.pageup @item_window.refresh elsif Input.trigger?(Input::R) @item_window.pagedown @item_window.refresh else p_a_e_item_paging_update_eqitem_selection end end end #============================================================================== # ■ Scene_Battle #------------------------------------------------------------------------------ #  バトル画面の処理を行うクラスです。 #============================================================================== class Scene_Battle < Scene_Base #-------------------------------------------------------------------------- # ● アイテム選択の更新 #-------------------------------------------------------------------------- alias p_a_e_item_paging_update_btitem_selection update_item_selection unless $@ def update_item_selection # L・Rでページ切り替えするように if Input.trigger?(Input::L) @item_window.pageup @item_window.refresh elsif Input.trigger?(Input::R) @item_window.pagedown @item_window.refresh else p_a_e_item_paging_update_btitem_selection end end end