203.ゲームオブジェクトの構造

 ステージに配置されるオブジェクトはGameObjectクラスか、その派生クラスを作成して配置します。
 GameObjectクラスのインスタンスを配置した場合、OnUpdate()関数などを記述すrことはできません。ですのでほとんどの場合派生クラスを作成してそのインスタンスを配置する形になります。
 この項ではGameObjectクラスはどういうクラスで、どういうことができるのかを述べます。
 また、その構成上重要なコンポーネントについては次項以降に述べます。

GameObjectクラス

 GameObjectクラスは派生クラスから様々な機能を使用できるよう設計されています。
 GameObjectクラスは、配置しただけでは何もしません。コンポーネントを追加し、そのコンポーネントのパラメータなどを設定してはじめてステージ上に表示あるいは動くようになります。
 まず、コンポーネント以外の機能や設定について述べます。

GameObjectの仮想関数

 GameObjectクラスには以下の仮想関数があり、ステージあるいはほかのフレームワークから呼び出されます。以下に主な仮想関数名と呼ばれるタイミング、そして多重定義する場合の注意をまとめました。

仮想関数名 呼ばれるタイミング 使用上の注意
OnPreCreate() コンストラクタの直後 必ず親クラスのOnPreCreate()を呼ぶ
OnCreate() OnPreCreate()の直後 通常はここで必要な初期化処理を行う
OnEvent() イベントが発生した時
OnUpdate() 各ターンの、最初の更新処理
OnCollision() 衝突判定実装時でかつFixでない場合に、何かに衝突始めた時
OnCollisionExcute() 衝突判定実装時でかつFixでない場合に、何かに衝突し続けているとき
OnCollisionExit() 衝突判定実装時でかつFixでない場合に、何かとの衝突状態が抜けたとき
OnUpdate2() 各ターンの、最後の更新処理
OnPreDraw() 描画処理の直前
OnGetDrawCamera() 描画用の独自カメラを必要とするとき
OnGetDrawLight() 描画用の独自ライトを必要とするとき
OnGet2DDrawProjMatrix() 2D描画用の独自射影行列を必要とするとき
OnDraw() 描画時 通常は描画コンポーネントに描画を任せる
 各仮想関数は、派生クラスで多重定義することで使用できますが、この表にはパラメータは乗ってませんが、パラメータを必要とするあるいは戻り値が必要な仮想関数もあるので注意しましょう。

GameObjectのアクセサ

 GameObjectでは、多くのパラメータ設定はコンポーネントで行うので、直接の設定は少ないのですが、あります。以下に主に使うパラメータ設定と取得(アクセサ)を述べます。

関数名 用途
bool IsUpdateActive() const;、 bool GetUpdateActive() const; 更新処理が有効かどうかを得る
void SetUpdateActive(bool b); 更新処理が有効かどうかを設定する
bool IsDrawActive() const;、 bool GetDrawActive() const; 描画処理が有効かどうかを得る
void SetDrawActive(bool b); 描画処理が有効かどうかを設定する
bool IsAlphaActive() const;、 bool GetAlphaActive() const; 透明処理するかどうかを得る
void SetAlphaActive(bool b); 透明処理するかどうかを設定する
int GetDrawLayer() const; 描画レイヤーを得る
void SetDrawLayer(int l); 描画レイヤーを設定する
shared_ptr GetStage(bool ExceptionActive = true) const; ステージを得る
 更新処理や描画処理は有効無効を設定できます。ステージの項でも説明しましたが、配置されているオブジェクトを削除でゲーム上から消す代わりに更新と描画を無効にするという方法で処理したほうが効率的な場合があります。(これはそのオブジェクトの追加と削除が頻繁に行われる場合です)。
 また、描画レイヤーの設定は、重なったオブジェクト同士の透明処理がうまくいかないときに使用します。通常は透明でないものを先に描画し、透明なものをあとに描画します。そして透明なもの同士は、カメラから見て遠い順に描画します。しかし、位置関係によっては透明処理がうまくいかないこともあります。そんな場合は、描画レイヤーを設定します。
 描画レイヤーが低い値だと、先に描画されます。デフォルトは0です。ですから-1にすればほかの0のオブジェクトより先に描画されます。同じ描画レイヤー同士ではカメラから見て遠い順ということになります。