自分自身でウィンドウを作成して中央に配置しよう!

Windows XP Editionの中央配置

著者:Kyonides

難易度:中級

はじめに

このチュートリアルの唯一の目的は、任意の種類のウィンドウを自由自在に中央配置する方法を示すことです。

それに加えて、ゲームシーン上で何かを作成または変更する際に重要な、避けられないいくつかの基本的な側面を思い出すために、いくつかの基本的な機能も簡単にレビューします。

予定されている段階

1 - 導入段階

  • ウィンドウの表示
  • 画像の凍結解除 / 凍結
  • ループの作成
  • updateメソッド

2 - ウィンドウの作成

  • ウィンドウの基本的な要素
  • パラメータの受け渡し
  • ビットマップと文字列の作成
  • ビットマップと文字列の描画

3 - ウィンドウの変更

  • モジュール性とカプセル化
  • ウィンドウの再配置
  • 再利用可能なコードの作成によるモジュール性の向上
  • ウィンドウの中央配置

導入段階

最終目標に応じて任意

注意: デフォルトのスクリプトを修正するだけの場合は、この段階を飛ばす必要がないかもしれません。

ステップ1- ウィンドウを適切に表示するには、シーンが必要です。

概要

エンジンにはすでに多くのシーンが用意されていますが、全新的なシーンを作成することで、新しいウィンドウにのみ集中することができます。

以下が、新しいシーンの最小限の骨格です:

class Scene_Test
end

古くからのRM(Ruby RPG Maker)のクラス命名規則に従い、このシーンはScene_Testと呼ばれています。
classキーワードは、複数回コピーできる全新的なオブジェクトを作成することを可能にします。

これがなぜ重要なのでしょうか?

実は、これがないと、毎回新しいシーンを作成するのではなく、同じシーンの最後の状態しか描画できないように強制されてしまうかもしれません。
キャンセルボタンを押すたびに、毎回同じインベントリや装備メニューしか開けないのは嫌ですよね?
代わりに、いくつかのオプションを表示させたいはずです。その場合、ここで必要なのはクラスです。

これでクラスができたので、次は何をすればよいでしょうか?

ステップ2 - 画面全体の画像を凍結解除 / 凍結します。

概要

class Scene_Test
def main
Graphics.transition
# ここにコードを記述
Graphics.freeze
end
end

defは、これからこのカスタムシーンクラスに属するメソッドを定義していることを意味します。

ここではmainメソッドを定義しました。これは、ゲームを継続してプレイするためにすべてのシーンが必要とするメソッドです。このメソッドがないと、すぐにエラーが表示されてしまいます。

前のシーン、現在のシーン、次のシーンの間のシームレスな遷移を作成するために、Graphicsモジュールで定義されているtransitionメソッドとfreezeメソッドを呼び出す必要があります。これは必須です。

通常、これはマップから離れ、シーンを開き、その後現在のマップに戻ることを意味します。

ステップ3 - 新しいシーンのためのループを作成します。

概要

class Scene_Test
def main
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
end
end

なぜループを作成するのでしょうか?

それは、現在のシーンに留まる必要があるからです。そうしないと、マップに戻ってしまいます。おそらく、マップ上のイベントが一時的に動かなくなることに気づくだけで、それ以上のことは起こらないでしょう。

シーンをスムーズに動作させるためには、2つのものを更新する必要があります:

  • グラフィック
  • 入力

グラフィックを更新しないと、エンジン側がフリーズしたと判断し、エラーを報告します。
入力関数を更新しないと、新しいシーンは完全に無意味になります。ただし、インタラクティブにすることを意図していない場合は別です。

注意:通常、遷移用のシーンには入力は必要ありません。代わりにタイマーに依存します。

また、このループをbreak(終了)させない限り、マップや他のどんなシーンに戻ることが也无法できません。selfは、現在作業中の現在のシーン(カスタムRubyクラス)を指します。

注意: 現時点では、画面には何も表示されません… 更新メソッドがないことを示すエラーメッセージが表示されるだけです。

ステップ4 - updateメソッドの追加。

概要

class Scene_Test
def main
Graphics.transition
loop do
Graphics.update
Input.update
update
break if $scene != self
end
Graphics.freeze
end

def update
if Input.trigger?(Input::B)
$game_system.se_play($data_system.cancel_se)
$scene = Scene_Map.new
return
end
end
end

これでupdateメソッドが存在するため、空のシーンから離れてマップに戻ることができます。

Input.trigger?は、プレイヤーがボタン(この場合はキャンセルボタン)を押して離したかどうかを問い合わせるために使用します。これがボタンをトリガーすることです。RGSSベースのエンジンでは、これらのボタンはA、B、C、SHIFTなどの定数で表されます。これらはすべてInputモジュールの一部です。参照演算子::がその接続を行います。

$game_system.se_play($data_system.cancel_se)メソッド呼び出しは、RMXPがゲーム内でSE(効果音)を再生するために使用する長い方法です。この特定のケースでは、キャンセルSEが再生されます。

$game_systemは、実行中のGame_Systemクラスの複製です。
se_playはそのメソッドの1つです。SEを再生します。
$data_systemは、すでにメモリに読み込まれているシステムタブの内容の複製です。
cancel_seは、以前にシステムタブで選択したキャンセルSE変数を表します。

もしこのようなif文(条件)を追加していなければ、テストシーンから決して抜け出すことができませんでした。:o
ゲームを無理やり終了させたくはないですよね?:stuck_out_tongue:

returnは、それを最初に呼び出したメソッドに戻ることを意味します。この場合は、mainメソッド内にあるループに戻ります。

注意:現時点では、画面には大きな黒い何もない状態しか見ることができません。:wink:

次の章では、実際のウィンドウの定義に取り掛かります。

「いいね!」 1