RGSS2知ったかぶり
シーンの基本構造
最終更新:
rgss2study
-
view
入門編・4
シーンの基本構造
クラスの派生
さて、Scene_Titleのmainを見ればいいということになったのですが。
あれ?
ないじゃありませんか。
そうです。スクリプトエディタのScene_Titleの項目を見ると、mainは無いのです。
じゃあ、Scene_Titleのmainって何だ?
Scene_Titleの7行目を見てみましょう。
あれ?
ないじゃありませんか。
そうです。スクリプトエディタのScene_Titleの項目を見ると、mainは無いのです。
じゃあ、Scene_Titleのmainって何だ?
Scene_Titleの7行目を見てみましょう。
class Scene_Title < Scene_Base
Scene_Titleの後に、Scene_Baseというものがついていますね。
実はこの記述、Scene_Titleは、Scene_Baseというクラスから派生している、という意味なのです。
では、派生とは何なのでしょうか?
派生を使うと、派生元のクラスから派生先のクラスに、変数とメソッドが受け継がれます。
変数というのは、パラメータのようなもの。
メソッドというのは、コマンドのようなものです。そして、探していたmainは、メソッドです。
Scene_Baseを見てみましょう。
Scene_Baseには、mainメソッドがあります。このmainがScene_Titleに受け継がれています。だから、Scene_Titleクラスにmainの記述が無くても、mainメソッドを持っていることになるのです。
ではScene_Titleクラスのmainメソッドの内容は? これも引き継がれたもの、すなわち、Scene_Baseのmainの内容と全く同じです。
ちなみに、全てのシーンクラスは、このScene_Baseのmainを引き継いでいます。
どのシーンクラスのmainも、見かけ上は同じ内容ということになります。しかし、もちろん実際はそうではありません。どういうことなのかは、これから分かるようになります。
実はこの記述、Scene_Titleは、Scene_Baseというクラスから派生している、という意味なのです。
では、派生とは何なのでしょうか?
派生を使うと、派生元のクラスから派生先のクラスに、変数とメソッドが受け継がれます。
変数というのは、パラメータのようなもの。
メソッドというのは、コマンドのようなものです。そして、探していたmainは、メソッドです。
Scene_Baseを見てみましょう。
Scene_Baseには、mainメソッドがあります。このmainがScene_Titleに受け継がれています。だから、Scene_Titleクラスにmainの記述が無くても、mainメソッドを持っていることになるのです。
ではScene_Titleクラスのmainメソッドの内容は? これも引き継がれたもの、すなわち、Scene_Baseのmainの内容と全く同じです。
ちなみに、全てのシーンクラスは、このScene_Baseのmainを引き継いでいます。
どのシーンクラスの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は、
最初の三行、start,perform_transition,post_startは、シーンが開始する前の処理で、コマンド名です(四行目はとりあえず無視)。
では、Scene_Baseのこれらのコマンドの定義を見てみましょう。例えばstartは、
def start end
あれ? 何もありません。どういうことでしょうか。
実は、startコマンドは、Scene_Titleのstartコマンドを行うのです。
クラスが継承されると、継承先のクラスに変数とメソッドを受け継ぎます。
しかし、継承先で同じ名前のメソッドが再定義された場合、継承先のクラスでそのメソッドを実行する時は、継承先で再定義した方のメソッドを実行するのです。
ややこしい文章ですが、要するに、本来は今Scene_Titleの話なので、Scene_Titleで定められていれば、そっちで定めた方を使うのです。mainは定めてないので継承元のクラスScene_Baseのmainを実行、startは定めているのでScene_Titleのstartを実行するのです。
では、Scene_Titleのstartメソッドはどうなっているでしょうか。
実は、startコマンドは、Scene_Titleのstartコマンドを行うのです。
クラスが継承されると、継承先のクラスに変数とメソッドを受け継ぎます。
しかし、継承先で同じ名前のメソッドが再定義された場合、継承先のクラスでそのメソッドを実行する時は、継承先で再定義した方のメソッドを実行するのです。
ややこしい文章ですが、要するに、本来は今Scene_Titleの話なので、Scene_Titleで定められていれば、そっちで定めた方を使うのです。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というものです。
superは、継承元のクラスの同名のメソッドを実行するという意味です。
ここでは、Scene_Baseのstartを実行しています(しかし前述のように中身は無いので、実際には何も実行されません)
一つ注意しておきたいのが、superというものです。
superは、継承元のクラスの同名のメソッドを実行するという意味です。
ここでは、Scene_Baseのstartを実行しています(しかし前述のように中身は無いので、実際には何も実行されません)
同様に、perform_transition,pre_startも継承先のScene_Titleで再定義されているので、そっちを使います。
そして、この三行で、メインループに入る前に必要な処理を全て行っています。
そして、この三行で、メインループに入る前に必要な処理を全て行っています。
メインループを見る
メインループというのは、6~11行目の、
loop do Graphics.update # ゲーム画面を更新 Input.update # 入力情報を更新 update # フレーム更新 break if $scene != self # 画面が切り替わったらループを中断 end
の部分のことです。6行目のloop doから11行目のendをひたすら繰り返し、
10行目に書かれるように、$sceneという変数の値が、自身と異なる場合、ループを抜けます。
そして、$sceneで定められた次のシーンに行くのですが、この詳しい意味は後述します。
なので、メインループの重要な部分は実質三行です。
10行目に書かれるように、$sceneという変数の値が、自身と異なる場合、ループを抜けます。
そして、$sceneで定められた次のシーンに行くのですが、この詳しい意味は後述します。
なので、メインループの重要な部分は実質三行です。
Graphics.update # ゲーム画面を更新 Input.update # 入力情報を更新 update # フレーム更新
コメントにあるとおり、1行目はゲーム画面を更新、
2行目は入力情報(コントローラやキーボードからの入力)の更新(入力を受け取るということ)
そして、3行目がフレーム更新。フレーム更新って何でしょう?
ゲームを進めるために、画面を変えて入力を受け取る以外にするべきこと。
2行目は入力情報(コントローラやキーボードからの入力)の更新(入力を受け取るということ)
そして、3行目がフレーム更新。フレーム更新って何でしょう?
ゲームを進めるために、画面を変えて入力を受け取る以外にするべきこと。
いっぱいありますね。
マップ画面で言えば、主人公を動かす、他のイベントを動かす、画面のスクロール、戦闘が始まらないかのチェック、背景のアニメーション、メニュー画面を開くべきかのチェック……。
要するに、莫大な量の計算と、その結果に応じて得られるゲームへの反映、全てです。これがフレーム更新です。
だから、表示して、入力を受け取って、計算して反映する。これがメインループの中身です。
実にシンプルですが、RPGに限らず、(ほぼ)全てのゲームはこのメインループの構造の元に作られています。
マップ画面で言えば、主人公を動かす、他のイベントを動かす、画面のスクロール、戦闘が始まらないかのチェック、背景のアニメーション、メニュー画面を開くべきかのチェック……。
要するに、莫大な量の計算と、その結果に応じて得られるゲームへの反映、全てです。これがフレーム更新です。
だから、表示して、入力を受け取って、計算して反映する。これがメインループの中身です。
実にシンプルですが、RPGに限らず、(ほぼ)全てのゲームはこのメインループの構造の元に作られています。
さて、とりあえず先に行きましょう。
メインループを抜けた後は、次のシーンに移るための終了処理です。
これは開始処理と同じく、継承先のクラスで定義されたのが中身です。
終了処理ののち、シーンが変更になり、シーンが続く限り別のシーンへ行って、また開始処理、メインループ、終了処理、の繰り返し……ということになります。
メインループを抜けた後は、次のシーンに移るための終了処理です。
これは開始処理と同じく、継承先のクラスで定義されたのが中身です。
終了処理ののち、シーンが変更になり、シーンが続く限り別のシーンへ行って、また開始処理、メインループ、終了処理、の繰り返し……ということになります。
さて、次回はシーンを作ってみます。
Scene_Titleの解析ではなく、いきなりシーンを作るなんてことをするのは、Scene_Titleの中身が難しいからです。
教材として、次回からシューティングゲームもどきを作ります。
何でシューティングゲームなんていきなりRPGと関係の無いものを作るか、と言われれば。
画像表示、入力、反映、その関係が非常にシンプルだからです。騙されたと思ってちょっと一緒に作ってみて下さい。
Scene_Titleの解析ではなく、いきなりシーンを作るなんてことをするのは、Scene_Titleの中身が難しいからです。
教材として、次回からシューティングゲームもどきを作ります。
何でシューティングゲームなんていきなりRPGと関係の無いものを作るか、と言われれば。
画像表示、入力、反映、その関係が非常にシンプルだからです。騙されたと思ってちょっと一緒に作ってみて下さい。
- すごくわかりやすいです!!
わかりやすい講座を探していたのでありがたいです。
続き楽しみにしています! -- (名無しさん) 2009-04-11 17:41:26 - コメントありがとうございます。
こんなに早く反応があるとは……。
ヘルプの解説を含め、シーンの構造などを説明しているものが
ほとんどなかったのが不満で、作ってみました。
本当に実はあんまり分かっていないので、至らないところも
多いかと思いますが、よろしくお願いします。 -- (管理人) 2009-04-11 18:58:22 - すいません、『自機を表示する』の記述に誤りがありました。
updateの中身を書かないと、自機の位置が正しく反映されません。
記事を修正しておきます。 -- (管理人) 2009-04-14 21:59:20 - ツクール古参ですがRGSSに四苦八苦でした(^^;)
が、シーンの基本構造を解説した記事にガチで救われました
応援してるんで、がんばってください!!続き楽しみです。
-- (うきぶくろ) 2009-04-27 12:17:15 - コメントありがとうございます。
一番書きたかったそのあたりは書いたもののなんだか忙しい+
自分でもRGSSの解読に手間取っているためになかなか更新できていません。
どの程度まで書けるか分かりませんがよろしくお願いします。 -- (管理人) 2009-04-28 08:40:35 - 敵キャラを作成する・2の最後の方に、
updateの際に敵キャラを扱うスプライトの更新を行うのを忘れていたのを修正しました。
イタリック体で修正が入っている部分です。 -- (管理人) 2009-05-02 22:10:23 - UFOが見にくかったので画像に縁取りをつけました。 -- (管理人) 2009-05-04 08:56:56
- ホントにスゴイと思います。尊敬します。
大変だと思いますが少しずつでいいんで頑張ってください。 -- (ユウ) 2009-05-12 00:07:40 - コメントありがとうございます。
恐らくこれを見て作る側はすぐなんでたいそうもどかしいと思いますが……。
ところで、今のところはちゃんとこの講座の通りで動くようになっているのでしょうか?
一応チェックはしてますが、多少ポカはすると思ってたので指摘が無いのがむしろ意外です。 -- (管理人) 2009-05-13 21:11:52 - 大丈夫です。ちゃんと動いています。
頑張ってください。続きが楽しみです。 -- (ユウ) 2009-05-18 01:06:59 - 1段目と言われている部分は『RGSS2』
2段目と言われている部分は『プリセットのスクリプト』
と言われると、より解り易い表現なのでは? -- (通行人) 2009-11-05 12:48:40 - @enemies[i] = Game_Enemy.new(200 + rand(312), rand(384))
↑argumentErrorが発生しました。wrong number of arguments(2 for 0)
どうすればいいでしょうか、頼みます。
-- (help me!!) 2010-01-05 00:22:50 - マウス入力はできますぜ。
Win32とかなんやらをつかって。
キーボードもできるみたいですが見つかりません。
探してます。 -- (シャミラ) 2010-03-24 05:28:28 - 勉強させてもらってます、とても参考になります。
入門編・10 にあるGame_Ememiesのクラスの
attr_accessor ;s_enemies ですが、;を:に変えないとエラーを吐きますので
コピペでやった人は修正した方がよさそうです
-- (邯鄲) 2010-09-04 17:27:18 - @enemies[i] = Game_Enemy.new(200 + rand(312), rand(384))
↑argumentErrorが発生しました。wrong number of arguments(2 for 0)
Game_Enemyクラスって最初からありますよね。
それが原因では? -- (ぽん) 2010-10-03 23:11:42 - 製作初心者なのでとても助かります!! -- (ありがとうございます!) 2011-02-05 12:44:03
- セーブ/ロードまわりはMarshalを使ってスクリプトで記述されていますし、
ファイルの読み書きもRubyと同様にできますから、
セーブやロードをいじるのはスクリプト操作でできることでは? -- (ななし) 2011-05-20 13:04:19 - ダンジョンなら3D化できると、下記サイトに書いてありました。 -- (だれかさん) 2011-08-18 07:26:19
- アルバイトはじめましたd(´∀`*)グッ♪ http://64n.co/ -- (私だ) 2012-01-09 04:49:41
- 風俗店を探よりココ!!男性は報酬あり!d(´∀`*)→ http://www.44m4.net/ -- (江梨子) 2012-08-20 17:11:02