6.メニュー画面
1.改変するクラスの把握
今回は、下のメニューを作成したいと思います。
スクリプトを編集する際には、再定義をしましょう。
デフォルトのスクリプトは、一切書き換えずに処理を置き換えます。
こうすることで、コードを簡潔にすることができます。
これから変更するスクリプトは、"▼ 素材"のセクションに追加してください。
まずは、Scene_Menu をコピペします。
セクション Scene_Menu を選択して、Ctrl + C
でコピーします。
セクション ( ここに追加 ) を選択して Ctrl + V で貼り付けます。
そして、いらないメソッドは削除しちゃいましょう。
不要な処理がなくなったことで、すごく見やすくなりましたね。
さて、次はウィンドウの描画を行っているクラスを探します。
大抵は、start メソッドを見ればわかります。
ゴールドウィンドウとコマンドウィンドウは、配置を変更するだけですので改変は不要ですね。
ステータスウィンドウは、表示を変えたいので再定義の必要がありそうです。
Scene_Menu クラスと同様にコピペっておきましょう。
スクリプトを編集する際には、再定義をしましょう。
デフォルトのスクリプトは、一切書き換えずに処理を置き換えます。
こうすることで、コードを簡潔にすることができます。
これから変更するスクリプトは、"▼ 素材"のセクションに追加してください。
まずは、Scene_Menu をコピペします。
セクション Scene_Menu を選択して、Ctrl + C
でコピーします。
セクション ( ここに追加 ) を選択して Ctrl + V で貼り付けます。
そして、いらないメソッドは削除しちゃいましょう。
不要な処理がなくなったことで、すごく見やすくなりましたね。
さて、次はウィンドウの描画を行っているクラスを探します。
大抵は、start メソッドを見ればわかります。
ゴールドウィンドウとコマンドウィンドウは、配置を変更するだけですので改変は不要ですね。
ステータスウィンドウは、表示を変えたいので再定義の必要がありそうです。
Scene_Menu クラスと同様にコピペっておきましょう。
2.ウィンドウの位置変更
では、ウィンドウの配置から変えていきましょう。
1.ゴールドウィンドウ
ゴールドウィンドウは、右上に表示させたいと思います。
x座標を決めるために、ウィンドウの横幅が知りたいです。
ウィンドウのセクションから Window_Gold を探しましょう。
はい、そのセクションの14行目で定義されていますね。
ここで、ウィンドウの横幅は 160 だとわかったので、ゴールドウィンドウの値を変更しましょう。
2.ステータスウィンドウ
さて、このウィンドウは、ゴールドの下に配置したいので、
今までと同じように、引数とウィンドウのサイズを確認しましょう。
14行目を変更して、横幅をフルサイズにします。
縦幅は大きすぎるので、小さくしましょう。
ゴールドウィンドウが、56 。コマンドウィンドウが、80 ですので、280 ですね。
(画面サイズ 416 - ゴールド 56 - コマンド - 80 = ステータスのサイズ 280)
3.地名ウィンドウ
このウィンドウは、デフォルトでは存在しないので自作する必要があります。
クラス定義するほどのものではないので、シーンクラスに直接定義しちゃいましょう。
そこで定義されている $game_map.name というメソッドでマップ名を取得します。
新しくウィンドウを生成するメソッドを作ったら、
開始処理と終了処理にも処理を追加してください。
@location_window.dispose のところは、
次のようにメソッドを追加し方が、統一されてて分かりやすいかもしれませんね。
4.コマンドウィンドウ
最後にコマンドウィンドウですね。
コマンドウィンドウの作成部分を見てみると、今までとは違い特殊な感じがしますね。
Window_Command クラスですね。
その後、コマンド・・・と続いています。
"=" の付いたものもあります。これは、引数を省略された場合に、この値を代入します。
コマンドは、横に4つ、縦に2つの計8つのものを作りたいので、
とりあえずコマンドウィンドウを生成する処理を次のように書き換えます。
それだと、項目数が多くなると期待した動作になりません。
ですので、このような方法を取っています。
これで、目的のコマンドウィンドウになったわけですが、項目名が左寄せになっているのが気になります。
気にならない人はスルーしといてください。その場合は、その後の refresh の処理も不要です。
クラスごと新しく定義してもいいのですが、今回は、特異メソッドというもので処理しようと思います。
普通、メソッドはクラスに定義されるのですが、特異メソッドは、オブジェクトに定義する事が出来ます。
では、テストプレーで見てみてください。
エラーが出た方は、もう一度確認してみてください。
これで、配置変更は終了です。
1.ゴールドウィンドウ
ゴールドウィンドウは、右上に表示させたいと思います。
x座標を決めるために、ウィンドウの横幅が知りたいです。
ウィンドウのセクションから Window_Gold を探しましょう。
はい、そのセクションの14行目で定義されていますね。
ここで、ウィンドウの横幅は 160 だとわかったので、ゴールドウィンドウの値を変更しましょう。
015: @gold_window = Window_Gold.new(384, 0)
2.ステータスウィンドウ
さて、このウィンドウは、ゴールドの下に配置したいので、
今までと同じように、引数とウィンドウのサイズを確認しましょう。
14行目を変更して、横幅をフルサイズにします。
縦幅は大きすぎるので、小さくしましょう。
ゴールドウィンドウが、56 。コマンドウィンドウが、80 ですので、280 ですね。
(画面サイズ 416 - ゴールド 56 - コマンド - 80 = ステータスのサイズ 280)
014: super(x, y, 544, 280)では、Scene_Menu に戻って、
016: @status_window = Window_MenuStatus.new(0, 56)に変更しましょう。
3.地名ウィンドウ
このウィンドウは、デフォルトでは存在しないので自作する必要があります。
クラス定義するほどのものではないので、シーンクラスに直接定義しちゃいましょう。
#--------------------------------------------------------------------------
# ◎ 現在地ウィンドウの作成
#--------------------------------------------------------------------------
def create_location_window
@location_window = Window_Base.new(0, 0, 384, 56)
@location_window.contents.font.color = @location_window.system_color
@location_window.contents.draw_text(0, 0, 60, 24, "現在地")
@location_window.contents.font.color = @location_window.normal_color
@location_window.contents.draw_text(62, 0, 290, 24, $game_map.name, 2)
end
マップ名表示の処理まで説明するのは、面倒なのでCBSを導入してください。そこで定義されている $game_map.name というメソッドでマップ名を取得します。
新しくウィンドウを生成するメソッドを作ったら、
開始処理と終了処理にも処理を追加してください。
@location_window.dispose のところは、
次のようにメソッドを追加し方が、統一されてて分かりやすいかもしれませんね。
def dispose_location_window @location_window.dispose end
4.コマンドウィンドウ
最後にコマンドウィンドウですね。
コマンドウィンドウの作成部分を見てみると、今までとは違い特殊な感じがしますね。
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])では、引数の確認のため、コマンドウィンドウの定義場所に移動します。
Window_Command クラスですね。
initialize(width, commands, column_max = 1, row_max = 0, spacing = 32)どうやら、160 とは横幅のことのようです。
その後、コマンド・・・と続いています。
"=" の付いたものもあります。これは、引数を省略された場合に、この値を代入します。
コマンドは、横に4つ、縦に2つの計8つのものを作りたいので、
とりあえずコマンドウィンドウを生成する処理を次のように書き換えます。
# 80行に収まらないので、コマンドは別に配列化 commands = [s1, s2, s3, s4, s5, s6] # 横幅 544, 横項目数 4, 縦幅を項目数に合わせる, 項目間の余白 8 に変更 @command_window = Window_Command.new(544, commands, 4, 0, 8) @command_window.y = 336 # ウィンドウのy座標を変更 @command_window.height = 80 # ウィンドウの縦幅を固定最後の縦幅の設定は、最初の設定で4つ目の引数を 0 ではなく 2 にすればできるのですが、
それだと、項目数が多くなると期待した動作になりません。
ですので、このような方法を取っています。
これで、目的のコマンドウィンドウになったわけですが、項目名が左寄せになっているのが気になります。
気にならない人はスルーしといてください。その場合は、その後の refresh の処理も不要です。
クラスごと新しく定義してもいいのですが、今回は、特異メソッドというもので処理しようと思います。
普通、メソッドはクラスに定義されるのですが、特異メソッドは、オブジェクトに定義する事が出来ます。
では、テストプレーで見てみてください。
エラーが出た方は、もう一度確認してみてください。
これで、配置変更は終了です。
3.メニューステータスの編集
今回手を加えるスクリプトは、Window_MenuStatus クラスですね。
ステータスの並びを変えたいので、refresh メソッドを見てみましょう。
for 内の処理ね。
順番にパーティのアクターの情報が代入されます。
描画の配置は、これで終わりです。 もし、CBSを導入していない場合は、経験値描画の処理が必要なので、次のメソッドを追加定義します。
HPやMPのメソッドを改変すると簡単ですね。
最後に枠の部分を書き換えて終了です。
確認はしてないですけど、大丈夫だと思います。
これで、オリジナルメニューの説明は終了です。
以降は、デフォルトメニューでの説明となります。
ステータスの並びを変えたいので、refresh メソッドを見てみましょう。
def refresh # ウィンドウ内の内容を消去する。 self.contents.clear # 項目数を設定する。(パーティの人数) @item_max = $game_party.members.size # パーティの人数だけ繰り返し描画する。 for actor in $game_party.members # ここからステータスを描画する処理 draw_actor_face(actor, 2, actor.index * 96 + 2, 92) x = 104 y = actor.index * 96 + WLH / 2 draw_actor_name(actor, x, y) draw_actor_class(actor, x + 120, y) draw_actor_level(actor, x, y + WLH * 1) draw_actor_state(actor, x, y + WLH * 2) draw_actor_hp(actor, x + 120, y + WLH * 1) draw_actor_mp(actor, x + 120, y + WLH * 2) end endこんな感じなんで、描画処理の部分だけ書き換えましょう。
for 内の処理ね。
x = 128 * actor.index y = 4 draw_actor_name(actor, x + 10, y) draw_actor_face(actor, x + 16, y + WLH * 1, 96) draw_actor_state(actor, x, y + WLH * 4, 128) draw_actor_level(actor, x + 10, y + WLH * 5) draw_actor_class(actor, x + 10, y + WLH * 6) draw_actor_hp(actor, x + 4, y + WLH * 7) draw_actor_mp(actor, x + 4, y + WLH * 8) draw_actor_exp(actor, x + 4, y + WLH * 9)変数 actor は、Game_Actor クラスです。
順番にパーティのアクターの情報が代入されます。
描画の配置は、これで終わりです。 もし、CBSを導入していない場合は、経験値描画の処理が必要なので、次のメソッドを追加定義します。
HPやMPのメソッドを改変すると簡単ですね。
# Game_Actor
#--------------------------------------------------------------------------
# ◎ レベルアップに必要な経験値の取得
#--------------------------------------------------------------------------
def level_up_exp
return @exp_list[@level+1] > 0 ? @exp_list[@level+1]-@exp_list[@level] : 0
end
# Window_MenuStatus #-------------------------------------------------------------------------- # ◎ 経験値の描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_exp(actor, x, y, width = 120) # ゲージ部分を描画 draw_actor_exp_gauge(actor, x, y, width) # 文字の色をシステムカラーに変更 self.contents.font.color = system_color # ゲージ上の左に描画する文字 self.contents.draw_text(x, y, 60, WLH, "EXP") # 文字の色をHPカラーに変更 self.contents.font.color = hp_color(actor) xr = x + width # 文字の色を標準色に変更 self.contents.font.color = normal_color # Lv 99 だったら 0 に置き換える text = actor.level == 99 ? 0 : actor.next_rest_exp_s # ゲージ上の右端にレベルアップまでの経験値を描画 self.contents.draw_text(xr - 60, y, 60, WLH, text, 2) end #-------------------------------------------------------------------------- # ◎ 経験値ゲージの描画 # actor : アクター # x : 描画先 X 座標 # y : 描画先 Y 座標 # width : 幅 #-------------------------------------------------------------------------- def draw_actor_exp_gauge(actor, x, y, width = 120) # Lv 99 ならゲージを満タンにする if actor.level == 99 gw = width else level_exp = actor.level_up_exp - actor.next_rest_exp_s gw = width * level_exp / actor.level_up_exp end # グラデーションカラー gc1 = Color.new(160, 160, 160) gc2 = Color.new(100, 100, 100) # ゲージの後ろを描画(黒い部分) self.contents.fill_rect(x, y + WLH - 8, width, 6, gauge_back_color) # ゲージを描画 self.contents.gradient_fill_rect(x, y + WLH - 8, gw, 6, gc1, gc2) endここまでで、画像のようになっているでしょうか?
最後に枠の部分を書き換えて終了です。
#-------------------------------------------------------------------------- # ○ カーソルの更新 #-------------------------------------------------------------------------- def update_cursor if @index < 0 # カーソルなし self.cursor_rect.empty elsif @index < @item_max # 通常 self.cursor_rect.set(@index * 128, 0, 128, contents.height) elsif @index >= 100 # 自分 self.cursor_rect.set((@index - 100) * 128, 0, 128, contents.height) else # 全体 self.cursor_rect.set(0, 0, @item_max * 128, contents.height) end endこんな感じです。
確認はしてないですけど、大丈夫だと思います。
これで、オリジナルメニューの説明は終了です。
以降は、デフォルトメニューでの説明となります。
4.コマンドウィンドウの編集
メニュー項目に関係のあるメソッドは、
・コマンドウィンドウの作成
・コマンド選択の更新
・アクター選択の更新
・それぞれのシーンの戻る処理
の4つです。
1.コマンドウィンドウの作成
項目名の部分は、いいですね。
項目名を変数に代入しているわけですが、
この名前は全て文字列を代入しましょう。
メニュー項目ですね。横幅と項目名を引数とします。
項目名は、表示する順番に配列化してあげます。
表示する順番を変えたい場合は、ここの順番を変えてあげると良いです。
もちろん、項目数を増やしたい場合もここの配列を増減させるだけです。
何のための処理かというと、項目を決定してメニューに戻ってきたときに
その決定した項目にカーソルが行くようにしているわけですね。
第1引数は、項目番号を指します。
先ほど項目名の配列を作成したと思います。この順番が項目番号です。
項目番号は、0から始まります。s1 が0、s4 が3となります。
2.コマンド選択の更新
禁止の真偽と禁止項目にカーソルがあるのかで分岐します。
禁止だった場合は、必ず return でメソッドを終了させる必要があります。
項目を並び替えた場合は、@command_window.index の値を変更する必要があります。
禁止処理を追加したい場合もここに追加してください。
項目の順番を変更した場合は、when の値を変更してください。
この値も項目番号です。
3.アクター選択の更新
アクターの選択を行う場合は、先ほどの項目処理で start_actor_selection と記述します。
キャンセルで戻ってきたときに、そのアクターにカーソルを合わせるためです。
when の値は、項目番号です。最初に配列化したやつですね。
この部分は、最初の項目処理と同じように記述すれば良いです。
@status_window.index は、選択したアクターの番号です。
4.元の画面へ戻る
戻るためのメソッドが用意されています。
項目の位置を変更した場合は、このメソッドを書き換えてあげる必要があります。
簡単に言うとメニューに戻ったときのカーソル位置ですね。
・コマンドウィンドウの作成
・コマンド選択の更新
・アクター選択の更新
・それぞれのシーンの戻る処理
の4つです。
1.コマンドウィンドウの作成
def create_command_window # 項目名の指定 s1 = Vocab::item s2 = Vocab::skill s3 = Vocab::equip s4 = Vocab::status s5 = Vocab::save s6 = Vocab::game_end # コマンドウィンドウを生成 @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6]) @command_window.index = @menu_index # カーソル位置 if $game_party.members.size == 0 # パーティ人数が 0 人の場合 @command_window.draw_item(0, false) # アイテムを無効化 @command_window.draw_item(1, false) # スキルを無効化 @command_window.draw_item(2, false) # 装備を無効化 @command_window.draw_item(3, false) # ステータスを無効化 end if $game_system.save_disabled # セーブ禁止の場合 @command_window.draw_item(4, false) # セーブを無効化 end endでは、小分けして見ていきたいと思います。
項目名の部分は、いいですね。
項目名を変数に代入しているわけですが、
この名前は全て文字列を代入しましょう。
@command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6])ここで、コマンドウィンドウを生成しています。
メニュー項目ですね。横幅と項目名を引数とします。
項目名は、表示する順番に配列化してあげます。
表示する順番を変えたい場合は、ここの順番を変えてあげると良いです。
もちろん、項目数を増やしたい場合もここの配列を増減させるだけです。
@command_window.index = @menu_indexこの処理は、項目の選択場所を指定しています。
何のための処理かというと、項目を決定してメニューに戻ってきたときに
その決定した項目にカーソルが行くようにしているわけですね。
if $game_party.members.size == 0 # パーティ人数が 0 人の場合 @command_window.draw_item(0, false) # アイテムを無効化 @command_window.draw_item(1, false) # スキルを無効化 @command_window.draw_item(2, false) # 装備を無効化 @command_window.draw_item(3, false) # ステータスを無効化 end if $game_system.save_disabled # セーブ禁止の場合 @command_window.draw_item(4, false) # セーブを無効化 endこれは、禁止にされている項目名を半透明にする処理です。
第1引数は、項目番号を指します。
先ほど項目名の配列を作成したと思います。この順番が項目番号です。
項目番号は、0から始まります。s1 が0、s4 が3となります。
2.コマンド選択の更新
def update_command_selection if Input.trigger?(Input::B) Sound.play_cancel $scene = Scene_Map.new elsif Input.trigger?(Input::C) # パーティが0人で尚且つ、カーソル位置が4番目以下 if $game_party.members.size == 0 and @command_window.index < 4 Sound.play_buzzer return # セーブが禁止されていて尚且つ、カーソル位置が5番目 elsif $game_system.save_disabled and @command_window.index == 4 Sound.play_buzzer return end # 下記はカーソル位置が禁止項目以外の場合に実行されます。 Sound.play_decision case @command_window.index when 0 # アイテム $scene = Scene_Item.new when 1,2,3 # スキル、装備、ステータス start_actor_selection when 4 # セーブ $scene = Scene_File.new(true, false, false) when 5 # ゲーム終了 $scene = Scene_End.new end end endここは、項目を選択して決定やキャンセルを行ったときの処理です。
# パーティが0人で尚且つ、カーソル位置が4番目以下 if $game_party.members.size == 0 and @command_window.index < 4 Sound.play_buzzer return # セーブが禁止されていて尚且つ、カーソル位置が5番目 elsif $game_system.save_disabled and @command_window.index == 4 Sound.play_buzzer return endこの部分で、項目の禁止処理を行っています。
禁止の真偽と禁止項目にカーソルがあるのかで分岐します。
禁止だった場合は、必ず return でメソッドを終了させる必要があります。
項目を並び替えた場合は、@command_window.index の値を変更する必要があります。
禁止処理を追加したい場合もここに追加してください。
case @command_window.index when 0 # アイテム $scene = Scene_Item.new when 1,2,3 # スキル、装備、ステータス start_actor_selection when 4 # セーブ $scene = Scene_File.new(true, false, false) when 5 # ゲーム終了 $scene = Scene_End.new endそして、ここで項目の処理を行います。
項目の順番を変更した場合は、when の値を変更してください。
この値も項目番号です。
3.アクター選択の更新
def update_actor_selection if Input.trigger?(Input::B) Sound.play_cancel end_actor_selection elsif Input.trigger?(Input::C) $game_party.last_actor_index = @status_window.index Sound.play_decision case @command_window.index when 1 # スキル $scene = Scene_Skill.new(@status_window.index) when 2 # 装備 $scene = Scene_Equip.new(@status_window.index) when 3 # ステータス $scene = Scene_Status.new(@status_window.index) end end endここの処理は、アクターの選択を行うところです。
アクターの選択を行う場合は、先ほどの項目処理で start_actor_selection と記述します。
$game_party.last_actor_index = @status_window.index選択されたアクターを記録します。
キャンセルで戻ってきたときに、そのアクターにカーソルを合わせるためです。
case @command_window.index when 1 # スキル $scene = Scene_Skill.new(@status_window.index) when 2 # 装備 $scene = Scene_Equip.new(@status_window.index) when 3 # ステータス $scene = Scene_Status.new(@status_window.index) endここで、アクター別の項目処理です。
when の値は、項目番号です。最初に配列化したやつですね。
この部分は、最初の項目処理と同じように記述すれば良いです。
@status_window.index は、選択したアクターの番号です。
4.元の画面へ戻る
def return_scene $scene = Scene_Menu.new(0) end各シーン(メニュー項目の処理)には、return_scene というメニューに
戻るためのメソッドが用意されています。
項目の位置を変更した場合は、このメソッドを書き換えてあげる必要があります。
$scene = Scene_Menu.new(項目番号)この部分の引数を選択した項目番号に変更しましょう。
簡単に言うとメニューに戻ったときのカーソル位置ですね。
5.メニュー項目の追加
※『4.コマンドウィンドウの編集』の項目を読んでから、ここは読んでください。
今回使用するスクリプト
1.当サイト「パーティ編成」
2.KGCさん「モンスター図鑑」
3.FSMさん「ExScene_Outline ver2.00」
では、この順番で追加したいと思います。
まずは、項目名の追加ですね。
「コマンドウィンドウの作成」というところを変更します。
12〜21の項目名の設定は、次のようにしてもいいかもしれません。
31行目のインデックス番号を忘れずに変更しておきましょう。
8番目の項目のインデックス番号は7です。0から始まるので -1 するだけですね。
ついでに、パーティ編成禁止の処理も追加してみました。
33〜35行目の処理ですね。
こんな感じのスイッチを作っておきます。
次は、「コマンド選択の更新」ですね。
48行目のセーブのインデックス番号を変更します。
さらに、追加したパーティ編成ですね。
51〜53行目の処理を追加します。
56行目からが選択項目の処理に飛ぶ処理ですね。
とりあえず、インデックス番号を修正して、65〜70行目を追加します。
うちのスクリプトには、予めメソッドが定義されているものもあるので、
そのようなスクリプトは、そのメソッドを使いたいと思います。
パーティ編成には、start_party_selectionがありますね。
ですので、これを使います。
[Scene_Menu]で呼び出すとか書いてあるものは、ここで使うと思ってもらって結構です。
モンスター図鑑には、call_enemy_guideがあるようですね。
しかし、call〜というのはマップからの呼び出しの可能性が高いです。
一応調べてみましょう。検索にcall_enemy_guideを入れてみます。
2つほど出てきましたが、どちらもnext_sceneを使用してますので、マップからのようです。
残念ながら、メニューからの呼び出しメソッドは定義されていないようなので、別の方法を探してみましょう。
このようなウィンドウを表示させて処理するスクリプトには、シーンクラスが定義されているはずです。
それを探しましょう。実際は、これを探すだけでいいんですが。。。
先ほどの検索で、$scene = Scene_EnemyGuide.new という記述がありましたね。
これが、シーン切り替えの処理ですので、このScene_EnemyGuideクラスに飛んで、
引数の意味を確認しましょう。
第1引数がコマンドのカーソル位置だそうです。コマンドってのは、メニュー項目の事ですね。
ここで項目の番号を渡すって事は、戻る処理で使うのかな?
第2引数が呼び出し元。省略時はメニューからなんでここはいいですね。
ということで、$scene = Scene_EnemyGuide.new(5)とします。
最後にあらすじですね。
同じようにシーンクラスを探しましょう。
ありました。Scene_Outlineですね。引数省略時は、-1のようです。
引数の値は、ページのインデックス。マイナス値ってどういうことかな?
この引数は、ウィンドウの方に渡されるようなので、そちらを確認してみます。
最新のページってことかな?
ということで引数を省略して、$scene = Scene_Outline.newとします。
これで、項目は追加できたと思いますが、忘れちゃいけない戻る処理です。
パーティ編成とモンスター図鑑は問題ないですね。
あらすじは、例外発生しちゃいますので、調べてみましょう。
163行目
これで、OKだと思います。
今回使用するスクリプト
1.当サイト「パーティ編成」
2.KGCさん「モンスター図鑑」
3.FSMさん「ExScene_Outline ver2.00」
では、この順番で追加したいと思います。
まずは、項目名の追加ですね。
「コマンドウィンドウの作成」というところを変更します。
12〜21の項目名の設定は、次のようにしてもいいかもしれません。
cmds = [ Vocab::item, Vocab::skill, Vocab::equip, Vocab::status, "パーティ編成", "モンスター図鑑", "あらすじ", Vocab::save, Vocab::game_end ]項目の順番を変更して、セーブが8番目にきたので、
31行目のインデックス番号を忘れずに変更しておきましょう。
8番目の項目のインデックス番号は7です。0から始まるので -1 するだけですね。
ついでに、パーティ編成禁止の処理も追加してみました。
33〜35行目の処理ですね。
こんな感じのスイッチを作っておきます。
次は、「コマンド選択の更新」ですね。
48行目のセーブのインデックス番号を変更します。
さらに、追加したパーティ編成ですね。
51〜53行目の処理を追加します。
56行目からが選択項目の処理に飛ぶ処理ですね。
とりあえず、インデックス番号を修正して、65〜70行目を追加します。
うちのスクリプトには、予めメソッドが定義されているものもあるので、
そのようなスクリプトは、そのメソッドを使いたいと思います。
パーティ編成には、start_party_selectionがありますね。
ですので、これを使います。
[Scene_Menu]で呼び出すとか書いてあるものは、ここで使うと思ってもらって結構です。
モンスター図鑑には、call_enemy_guideがあるようですね。
しかし、call〜というのはマップからの呼び出しの可能性が高いです。
一応調べてみましょう。検索にcall_enemy_guideを入れてみます。
2つほど出てきましたが、どちらもnext_sceneを使用してますので、マップからのようです。
残念ながら、メニューからの呼び出しメソッドは定義されていないようなので、別の方法を探してみましょう。
このようなウィンドウを表示させて処理するスクリプトには、シーンクラスが定義されているはずです。
それを探しましょう。実際は、これを探すだけでいいんですが。。。
先ほどの検索で、$scene = Scene_EnemyGuide.new という記述がありましたね。
これが、シーン切り替えの処理ですので、このScene_EnemyGuideクラスに飛んで、
引数の意味を確認しましょう。
第1引数がコマンドのカーソル位置だそうです。コマンドってのは、メニュー項目の事ですね。
ここで項目の番号を渡すって事は、戻る処理で使うのかな?
第2引数が呼び出し元。省略時はメニューからなんでここはいいですね。
ということで、$scene = Scene_EnemyGuide.new(5)とします。
最後にあらすじですね。
同じようにシーンクラスを探しましょう。
ありました。Scene_Outlineですね。引数省略時は、-1のようです。
引数の値は、ページのインデックス。マイナス値ってどういうことかな?
この引数は、ウィンドウの方に渡されるようなので、そちらを確認してみます。
@page_index = page_index >= 0 ? page_index : @page_count - 1と、ありますね。page_indexは、-1ですのでfalse。総ページ数 - 1の値が表示するページになるようです。
最新のページってことかな?
ということで引数を省略して、$scene = Scene_Outline.newとします。
これで、項目は追加できたと思いますが、忘れちゃいけない戻る処理です。
パーティ編成とモンスター図鑑は問題ないですね。
あらすじは、例外発生しちゃいますので、調べてみましょう。
163行目
$scene = Scene_Menu.new($game_party.last_menu_index)これを次のように書き換えます。
$scene = Scene_Menu.new(6)この数値は、戻る項目の番号ですね。
これで、OKだと思います。
6.[おまけ]全体の背景を表示する
メニュー全体のことですので、Scene_Menu を変更すればいいですね。
Sprite で表示して良いでしょうが、メニューの背景にはマップが表示されていたと思います。
このマップ画像を表示している処理があるはずなので、そこを変更するのがスマートかもしれません。
とりあえず、処理を探しましょう。
Scene_Menu の処理を順番に見ていきます。
Start メソッドで気になるメソッドがありますね。
create_menu_background "メニュー背景を作る" 思いっきりそのまま。
これで全検索をかけます。
このメソッドを定義しているのは1箇所だけですね。
Scene_Base は、Scene_Menu のスーパークラスなので、
create_menu_background をコピーすればそのまま使えます。
では、画像のようになっていることを前提に処理の解説をしたいと思います。
スプライトの説明は、省かせていただいて2つ目の処理ですね。
先ほど create_menu_background をコピーしてきた場所のすぐ上で処理されていたと思います。
背景画像はここで指定しているようなので、この部分を別の画像に置き換えればいいわけです。
たとえば、こんな感じに。
次の処理は、スプライトにカラーを設定して画像を暗くしていますね。
だから、メニューの背景は暗かったわけです。
最後の処理が背景画像の更新処理ですね。
このメソッドは空ですので、あってもなくてもどちらでもいいですね。
とりあえず残しておくことにします。
毎フレームごとに背景に変化を付けたい場合なんかに使えますね。
たとえば、背景をスクロールさせたりなんかに。
できたスクリプトを実行すると、次のようになります。
Sprite で表示して良いでしょうが、メニューの背景にはマップが表示されていたと思います。
このマップ画像を表示している処理があるはずなので、そこを変更するのがスマートかもしれません。
とりあえず、処理を探しましょう。
Scene_Menu の処理を順番に見ていきます。
Start メソッドで気になるメソッドがありますね。
create_menu_background "メニュー背景を作る" 思いっきりそのまま。
これで全検索をかけます。
このメソッドを定義しているのは1箇所だけですね。
Scene_Base は、Scene_Menu のスーパークラスなので、
create_menu_background をコピーすればそのまま使えます。
では、画像のようになっていることを前提に処理の解説をしたいと思います。
スプライトの説明は、省かせていただいて2つ目の処理ですね。
@menuback_sprite.bitmap = $game_temp.background_bitmapこの$game_temp.background_bitmapという変数に背景のマップ画像がぼかされて格納されています。
先ほど create_menu_background をコピーしてきた場所のすぐ上で処理されていたと思います。
背景画像はここで指定しているようなので、この部分を別の画像に置き換えればいいわけです。
たとえば、こんな感じに。
@menuback_sprite.bitmap = Cache.system("Title")これで、背景画像がマップからタイトルに変わったはずです。
次の処理は、スプライトにカラーを設定して画像を暗くしていますね。
だから、メニューの背景は暗かったわけです。
@menuback_sprite.color.set(16, 16, 16, 128)この部分は、必要ないので削除してしまいましょう。
最後の処理が背景画像の更新処理ですね。
このメソッドは空ですので、あってもなくてもどちらでもいいですね。
とりあえず残しておくことにします。
毎フレームごとに背景に変化を付けたい場合なんかに使えますね。
たとえば、背景をスクロールさせたりなんかに。
できたスクリプトを実行すると、次のようになります。
7.[おまけ]ステータス画面にピクチャを表示する
今回は、顔グラのようにウィンドウに直接描画する方法を説明したいと思います。
そう、顔グラのようにです。
じゃあ、顔グラの処理を見れば表示方法が分かってしまうわけですね。
顔グラの処理は、draw_actor_face ですね。顔って言ってるくらいですから間違いないでしょう。
それでは、全検索しましょう。 draw_face で顔グラを描画してるみたいですね。
draw_face にジャンプして表示方法を見てみてください。
初めのうちは、こうして似ている処理を見て参考にするのが良いと思います。
では、必要な部分だけ再定義しましょう。
Window_MenuStatus は、メソッドが少ないので分かりやすいですね。
大まかな処理は、次のようになっています。
立ち絵を表示するので、顔グラはいらないですよね?
ですので、draw_actor_face を再定義して立ち絵を表示したいと思います。
今回は、"Actor1" や "Actor3" などアクターIDで表示するファイルを指定しています。
※ Pictures フォルダに、176 x 192 の画像を入れておいてください。
もし、アクター名で指定したいなら、次のようにすればファイル名をアクター名にすることができます。
で、これが画像を描画する処理です。
使い方は、ヘルプの Bitmap クラスに書いてあります。
表示する場所のx座標とy座標、表示する画像、画像の表示したい部分を引数としてます。
画像は先ほど取得した画像を、表示したい部分は全体を表示したいので、
rect メソッドで全体を指定しています。
あとは、描画する位置を調整すれば完成です。
こちらが完成画像です。
※ 画像描画の説明ですので、位置調整・カーソルの説明は省かせていただきました。
そう、顔グラのようにです。
じゃあ、顔グラの処理を見れば表示方法が分かってしまうわけですね。
顔グラの処理は、draw_actor_face ですね。顔って言ってるくらいですから間違いないでしょう。
それでは、全検索しましょう。 draw_face で顔グラを描画してるみたいですね。
draw_face にジャンプして表示方法を見てみてください。
初めのうちは、こうして似ている処理を見て参考にするのが良いと思います。
では、必要な部分だけ再定義しましょう。
Window_MenuStatus は、メソッドが少ないので分かりやすいですね。
大まかな処理は、次のようになっています。
立ち絵を表示するので、顔グラはいらないですよね?
ですので、draw_actor_face を再定義して立ち絵を表示したいと思います。
bitmap = Cache.picture("Actor#{actor.id}")この部分で、表示したい画像を用意しています。
今回は、"Actor1" や "Actor3" などアクターIDで表示するファイルを指定しています。
※ Pictures フォルダに、176 x 192 の画像を入れておいてください。
もし、アクター名で指定したいなら、次のようにすればファイル名をアクター名にすることができます。
bitmap = Cache.picture(actor.name)こっちの方がフォルダ内を見たときに、分かりやすいかな?
で、これが画像を描画する処理です。
self.contents.blt(x, y, bitmap, bitmap.rect)この辺は文字などを描画する処理と同じですね。
使い方は、ヘルプの Bitmap クラスに書いてあります。
表示する場所のx座標とy座標、表示する画像、画像の表示したい部分を引数としてます。
画像は先ほど取得した画像を、表示したい部分は全体を表示したいので、
rect メソッドで全体を指定しています。
あとは、描画する位置を調整すれば完成です。
こちらが完成画像です。
※ 画像描画の説明ですので、位置調整・カーソルの説明は省かせていただきました。
8.[おまけ]ウィンドウをスライドさせる
最も簡単な方法は、開始後処理(post_start)と終了前処理(pre_terminate)に
ウィンドウを移動する処理を追加することではないでしょうか。
この2つのメソッドは、Scene_Base に空メソッドとして定義してあります。
まずは、Scene_Menu#start で表示されるウィンドウを画面外に配置します。
これがないと、移動しているところが表示されません。
ウィンドウを移動する処理を追加することではないでしょうか。
この2つのメソッドは、Scene_Base に空メソッドとして定義してあります。
まずは、Scene_Menu#start で表示されるウィンドウを画面外に配置します。
#-------------------------------------------------------------------------- # ○ 開始処理 #-------------------------------------------------------------------------- def start super create_menu_background create_command_window @gold_window = Window_Gold.new(0, 360) @status_window = Window_MenuStatus.new(160, 0) # ウィンドウを画面外へ移動 @command_window.x = -@command_window.width @gold_window.x = -@gold_window.width @status_window.x = 160 + @status_window.width endさらに、以下の2つのメソッドを Scene_Menu へオーバーライドします。
#-------------------------------------------------------------------------- # ◎ 開始後処理 #-------------------------------------------------------------------------- def post_start super # 表示にかけるフレーム数 frame_count = 20 # 1フレームで移動する距離を計算 cx = @command_window.width / frame_count gx = @gold_window.width / frame_count sx = @status_window.width / frame_count # 移動開始 frame_count.times do @command_window.x += cx @gold_window.x += gx @status_window.x -= sx Graphics.update end # 移動位置の調節 @command_window.x = 0 @gold_window.x = 0 @status_window.x = 160 Graphics.update end
#-------------------------------------------------------------------------- # ◎ 終了前処理 #-------------------------------------------------------------------------- def pre_terminate super # 表示にかけるフレーム数 frame_count = 20 cx = @command_window.width / frame_count gx = @gold_window.width / frame_count sx = @status_window.width / frame_count # 1フレームで移動する距離を計算 frame_count.times do @command_window.x -= cx @gold_window.x -= gx @status_window.x += sx Graphics.update end # 移動位置の調節 @command_window.x = -@command_window.width @gold_window.x = -@gold_window.width @status_window.x = 160 + @status_window.width Graphics.update endGraphics.update というのは、画面を更新するための処理です。
これがないと、移動しているところが表示されません。