「シーンの基本構造」の編集履歴(バックアップ)一覧はこちら

シーンの基本構造」(2009/04/10 (金) 08:36:53) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

入門編・4 *シーンの基本構造 **クラスの派生 さて、Scene_Titleのmainを見ればいいということになったのですが。 あれ? ないじゃありませんか。 そうです。スクリプトエディタのScene_Titleの項目を見ると、mainは無いのです。 じゃあ、Scene_Titleのmainって何だ? Scene_Titleの7行目を見てみましょう。 >class Scene_Title < Scene_Base Scene_Titleの後に、Scene_Baseというものがついていますね。 実はこの記述、Scene_Titleは、Scene_Baseというクラスから派生している、という意味なのです。 では、派生とは何なのでしょうか? 派生を使うと、派生元のクラスから派生先のクラスに、&bold(){変数とメソッドが受け継がれます}。 変数というのは、パラメータのようなもの。 メソッドというのは、コマンドのようなものです。そして、探していたmainは、メソッドです。 Scene_Baseを見てみましょう。 Scene_Baseには、mainメソッドがあります。このmainがScene_Titleに受け継がれています。だから、&bold(){Scene_Titleクラスにmainの記述が無くても、mainメソッドを持っていることになる}のです。 ではScene_Titleクラスのmainメソッドの内容は? これも引き継がれたもの、すなわち、&bold(){Scene_Baseのmainの内容と全く同じです}。 ちなみに、全てのシーンクラスは、このScene_Baseのmainを引き継いでいます。 &bold(){どのシーンクラスのmainも、見かけ上は同じ内容}ということになります。しかし、もちろん実際はそうではありません。どういうことなのかは、これから分かるようになります。 **mainの構造を見る 下に、Scene_Baseのmainの内容を示します。 >  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 最初の行のdef main ~ endまでで、mainというメソッドを定義しています。実行されるのはdef mainの次の行から。 最初の三行、start,perform_transition,post_startは、シーンが開始する前の処理で、コマンド名です(四行目はとりあえず無視)。 では、Scene_Baseのこれらのコマンドの定義を見てみましょう。例えばstartは、 > def start > end あれ? 何もありません。どういうことでしょうか。 実は、&bold(){startコマンドは、Scene_Titleのstartコマンドを行うのです}。 クラスが継承されると、継承先のクラスに変数とメソッドを受け継ぎます。 しかし、&bold(){継承先で同じ名前のメソッドが再定義された場合、継承先のクラスでそのメソッドを実行する時は、継承先で再定義した方のメソッドを実行する}のです。 ややこしい文章ですが、要するに、本来は今Scene_Titleの話なので、Scene_Titleで定められていれば、そっちで定めた方を使うのです。&bold(){mainは定めてないので継承元のクラスのmainを実行、startは定めているのでScene_Titleのstartを実行するのです}。 ---- [[前へ>Mainの中身を見る]]・[[次へ>シーンを作ってみる]] ---- #comment_num2(size=40,vsize=4,num=20,logpage=コメント一覧)
入門編・4 *シーンの基本構造 **クラスの派生 さて、Scene_Titleのmainを見ればいいということになったのですが。 あれ? ないじゃありませんか。 そうです。スクリプトエディタのScene_Titleの項目を見ると、mainは無いのです。 じゃあ、Scene_Titleのmainって何だ? Scene_Titleの7行目を見てみましょう。 >class Scene_Title < Scene_Base Scene_Titleの後に、Scene_Baseというものがついていますね。 実はこの記述、Scene_Titleは、Scene_Baseというクラスから派生している、という意味なのです。 では、派生とは何なのでしょうか? 派生を使うと、派生元のクラスから派生先のクラスに、&bold(){変数とメソッドが受け継がれます}。 変数というのは、パラメータのようなもの。 メソッドというのは、コマンドのようなものです。そして、探していたmainは、メソッドです。 Scene_Baseを見てみましょう。 Scene_Baseには、mainメソッドがあります。このmainがScene_Titleに受け継がれています。だから、&bold(){Scene_Titleクラスにmainの記述が無くても、mainメソッドを持っていることになる}のです。 ではScene_Titleクラスのmainメソッドの内容は? これも引き継がれたもの、すなわち、&bold(){Scene_Baseのmainの内容と全く同じです}。 ちなみに、全てのシーンクラスは、このScene_Baseのmainを引き継いでいます。 &bold(){どのシーンクラスのmainも、見かけ上は同じ内容}ということになります。しかし、もちろん実際はそうではありません。どういうことなのかは、これから分かるようになります。 **mainの構造を見る 下に、Scene_Baseのmainの内容を示します。 >  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 最初の行のdef main ~ endまでで、mainというメソッドを定義しています。実行されるのはdef mainの次の行から。 最初の三行、start,perform_transition,post_startは、シーンが開始する前の処理で、コマンド名です(四行目はとりあえず無視)。 では、Scene_Baseのこれらのコマンドの定義を見てみましょう。例えばstartは、 > def start > end あれ? 何もありません。どういうことでしょうか。 実は、&bold(){startコマンドは、Scene_Titleのstartコマンドを行うのです}。 クラスが継承されると、継承先のクラスに変数とメソッドを受け継ぎます。 しかし、&bold(){継承先で同じ名前のメソッドが再定義された場合、継承先のクラスでそのメソッドを実行する時は、継承先で再定義した方のメソッドを実行する}のです。 ややこしい文章ですが、要するに、本来は今Scene_Titleの話なので、Scene_Titleで定められていれば、そっちで定めた方を使うのです。&bold(){mainは定めてないので継承元のクラスScene_Baseのmainを実行、startは定めているのでScene_Titleのstartを実行するのです}。 では、Scene_Titleのstartメソッドはどうなっているでしょうか。 > def start > super > load_database # データベースをロード > create_game_objects # ゲームオブジェクトを作成 > check_continue # コンティニュー有効判定 > create_title_graphic # タイトルグラフィックを作成 > create_command_window # コマンドウィンドウを作成 > play_title_music # タイトル画面の音楽を演奏 > end ちゃんと、タイトル画面を作るのに必要そうなことをやっていますね。具体的な内容は今は飛ばします。 一つ注意しておきたいのが、superというものです。 &bold(){superは、継承元のクラスの同名のメソッドを実行する}という意味です。 ここでは、Scene_Baseのstartを実行しています(しかし前述のように中身は無いので、実際には何も実行されません) 同様に、perform_transition,pre_startも継承先のScene_Titleで再定義されているので、そっちを使います。 そして、この三行で、&bold(){メインループ}に入る前に必要な処理を全て行っています。 **メインループを見る メインループというのは、6~11行目の、 > loop do > Graphics.update # ゲーム画面を更新 > Input.update # 入力情報を更新 > update # フレーム更新 > break if $scene != self # 画面が切り替わったらループを中断 > end の部分のことです。6行目のloop doから11行目のendをひたすら繰り返し、 10行目に書かれるように、$sceneという変数の値が、自身と異なる場合、ループを抜けます。 そして、$sceneで定められた次のシーンに行くのですが、この詳しい意味は後述します。 なので、&bold(){メインループの重要な部分は実質三行です}。 > Graphics.update # ゲーム画面を更新 > Input.update # 入力情報を更新 > update # フレーム更新 コメントにあるとおり、1行目はゲーム画面を更新、 2行目は入力情報(コントローラやキーボードからの入力)の更新(入力を受け取るということ) そして、3行目がフレーム更新。フレーム更新って何でしょう? ゲームを進めるために、画面を変えて入力を受け取る以外にするべきこと。 いっぱいありますね。 マップ画面で言えば、主人公を動かす、他のイベントを動かす、画面のスクロール、戦闘が始まらないかのチェック、背景のアニメーション、メニュー画面を開くべきかのチェック……。 要するに、&bold(){莫大な量の計算と、その結果に応じて得られるゲームへの反映、全てです。これがフレーム更新です}。 だから、表示して、入力を受け取って、計算して反映する。これがメインループの中身です。 実にシンプルですが、&bold(){RPGに限らず、(ほぼ)全てのゲームはこのメインループの構造の元に作られています}。 さて、とりあえず先に行きましょう。 メインループを抜けた後は、次のシーンに移るための終了処理です。 これは開始処理と同じく、継承先のクラスで定義されたのが中身です。 終了処理ののち、シーンが変更になり、シーンが続く限り別のシーンへ行って、また開始処理、メインループ、終了処理、の繰り返し……ということになります。 さて、次回はシーンを作ってみます。 Scene_Titleの解析ではなく、いきなりシーンを作るなんてことをするのは、&bold(){Scene_Titleの中身が難しいから}です。 教材として、次回からシューティングゲームもどきを作ります。 何でシューティングゲームなんていきなりRPGと関係の無いものを作るか、と言われれば。 画像表示、入力、反映、その関係が非常にシンプルだからです。騙されたと思ってちょっと一緒に作ってみて下さい。 ---- [[前へ>Mainの中身を見る]]・[[次へ>シーンを作ってみる]] ---- #comment_num2(size=40,vsize=4,num=20,logpage=コメント一覧)

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー