RPGツクールVX (XPも) のRGSSは $sceneっていうグローバル変数が軸になってプログラムが実行されている。正確にはスクリプトの「Main」の中に書いてある一文、
$scene.main while $scene != nil
というのがプログラムを実行させていると考えていい。
この一行を簡単に言うと「$sceneというグローバル変数の中がnilじゃない限りその変数に入っているクラスのメソッド " main " をずっと行う」みたいな感じ。
$sceneの中に入るのはシーンクラスのみ。他のクラスをいれてしまうとエラーが起きる。正確には「main」というメソッドを持ったクラスならとりあえずOKっぽい。
じゃあ、そのmainってのは何をやっているのかというと、そこでScene_Baseクラス
じゃん。
#-----------------------------------------------------------------
# ● メイン処理
#-----------------------------------------------------------------
def main
start
# 開始処理
perform_transition
# トランジション実行
post_start
# 開始後処理
Input.update
# 入力情報を更新
loop do
Graphics.update
# ゲーム画面を更新
Input.update
# 入力情報を更新
update
# フレーム更新
break if $scene != self
# 画面が切り替わったらループを中断
end
Graphics.update
pre_terminate
# 終了前処理
Graphics.freeze
# トランジション準備
terminate
# 終了処理
end
Scene_Baseはシーン関係のスーパークラスとして使われるので再定義や上書きをされていない限りはこの処理が行われると。
で、処理の真ん中あたりにあるloop の中身をずっと繰り返している。$sceneの中身が変わったらbreakとなっているのでシーンが変わらない限りはupdateメソッドが行われているわけだ……。
トランジションは画面切替の効果なので手をつけなくてもいいと思う。
画面がなめらかに切り替わっているのはこのトランジション処理のおかげ。
だからまあ、新しくシーンを作りたい場合はこれらのメソッドに行いたい処理を入れればいいという事。
start 画面切替の前に行っておきたい処理(画像の準備とか)
post_start 画面切替の後に 〃
update シーンが行われている間にフレーム毎に行いたい処理
pre_terminate 終了の画面切替の前に行いたい処理
terminate 画面切替中に行いたい処理
おのおののメソッド名がInitialize や dispose とは違い start や terminate という名前にしているのは
恐らく混同しないためかと思う。
ちなみに Scene_XXXX.new の時に呼び出される関数はInitializeなのでシーン移動の際に引数を入れたい場合はInitialize関数を入れてそこで引数を使う処理をするといい。
スクリプト例とか作るのは手間なので割愛。リクエストあればやりますが、カウンターまだ1しか回ってないし(笑)。
こうやって紐解いていくと意外とシンプルなのがわかる。
まあ、グラフィック関連についてはまだまだサッパリなんだけどね。