シーンクラスの仕組みを理解しよう!

 2012-11-21
シーンクラスは、どのバージョンでも基本は同じです。
XP と VX のシーンクラスも見ながら、VX Ace のシーンクラスが
どのような動きをしているのか見てみましょう。

シーンの実行は、以下のような繰り返しとなります。
run -> main -> start -> update -> terminate -> run

まず、ゲームが開始されると run 処理が実行されます。
ここでは、シーンオブジェクトを変数で保持しておき、
シーンが格納されていれば main 処理を繰り返し実行します。
SS121111774419.png

main 処理では、start 処理を実行して、シーン(変数の値)が変更されるまで、
update 処理を実行し続けます。
シーン遷移があれば、更新処理のループを抜けるので terminate 処理が実行されます。
ここで main 処理が終了するので、run 処理へ戻ります。
SS121029763823.png
run 処理に戻ると、変数の値(シーンオブジェクト)が変更されているので、
先ほどとは違う main 処理が実行されます。この繰り返しです。

run 処理は、シーンクラス外に定義され、main 処理は、シーンクラス内に定義されています。
どのバージョンでも、シーンクラスは「開始処理」「更新処理」「終了処理」の3つで構成されていますね。
開始処理 (start) ...... 主にウィンドウの作成
更新処理 (update) ..... 画面更新、入力更新、ウィンドウの更新、シーン処理(動作や操作)
終了処理 (terminate) .. 主にウィンドウの消去
XP は main から定義する必要がありますが、
VX は、 start や update や terminate などの定義のみで良く、
Ace になると start のみの定義で terminate などは自動で行ってくれます。
バージョンアップごとに自動化されているわけですね。

この自動処理が曲者ですので、いつ何が実行されるのかを確認しておくと良いと思います。


では、実際にシーンクラスを作成したいと思います。

次の2行が、最小のシーンクラスとなります。スクリプトエディタに書き込んでください。
class Scene_Class < Scene_Base
end
イベントコマンド「スクリプト」で以下のコードを実行してください。
SceneManager.goto(Scene_Class)
画面が真っ黒になれば、正しく動作しています。

XP と VX でのシーン遷移は、$scene = Scene_Class.new でしたが、
Ace では、SceneManager.goto(Scene_Class) となっています。

また、新機能として呼び出し元のシーンを記憶して、戻ることもできるようになりました。
SceneManager.call(Scene_Class)  # 呼び出したシーンを記録して、シーン遷移
SceneManager.return # 呼び出し元のシーンへ戻る
便利な機能ですが、2点注意しなければいけないところがあります。
まず、シーンオブジェクトは解放されません。
そのため、元のシーンへ戻った場合には、initialize は実行されませんし、
インスタンス変数の値もそのままです。
しかし、terminate は実行されるので、ウィンドウの変数などにはゴミが残ります。
つまり、シーンオブジェクトの状態はそのままで、ウィンドウオブジェクトは新しくなります。
2つ目は、マップ画面に移動すると、すべての履歴が消えることです。
ピンとこなければ、通常は気にする必要もないと思いますので、深く考えなくても良いと思います。

では、新機能を使って、戻る処理を足してみます。
# スクリプトエディタ
class Scene_Class < Scene_Base
def update
super
return_scene if Input.trigger?(:B)
end
end
# イベントコマンド「スクリプト」
SceneManager.call(Scene_Class)

Ace では、シーンのベースクラスに Scene_MenuBase クラスが追加されました。
背景画像の表示機能は、このクラスに定義されているので、
Ace では、このクラスを多用することになると思います。
# スクリプトエディタ
class Scene_Class < Scene_MenuBase
def update
super
return_scene if Input.trigger?(:B)
end
end
# イベントコマンド「スクリプト」
SceneManager.call(Scene_Class)

今回は、テストなのでこれでも良いのですが、
イベントコマンドでシーン遷移を行う際には、Fiber.yield を実行して処理を進める必要があります。
SceneManager.call(Scene_Class)
Fiber.yield
Fiber.yield は、ウェイト 1 と同じ効果があるので、イベントコマンドでも代用できます。

今回の例は、RGSS2講座『シーンクラス』の (2) 最小のシーンクラス と
同じことをしていますので、よろしければ見比べてみてください。
Ace の方が少ないコードで済んでいることがわかると思います。


以上で、シーンクラスの説明は終わりです。

Ace では、イベント駆動型の記述になっているので、その辺の解説もしたかったのですが、
長くなってしまうので、残念ながら割愛させていただきます。
以前のバージョン通りの書き方も十分できますので、
新しい仕組みがわからなければ、使わなければいいものだと思います。
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/664-f9586b1b
≪ トップページへこのページの先頭へ  ≫
カレンダー
01 << 2017/02 >> 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -

カテゴリー
最近の記事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事
08/08 お返事

最近のコメント
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事
02/24 お返事

タグクラウド

リンク