ゲームに登場する全てのもの(プレイヤー、敵、背景、UI・・・など)をゲームオブジェクトと呼ぶ。
基本的に1つのゲームオブジェクトに対し、次のような1つのクラスを作成していくことになる。
<ヘッダーファイル> (●●●は好きな名前)
#pragma once#include "Engine/GameObject.h"//◆◆◆を管理するクラスclass ●●● : public GameObject{public: //コンストラクタ ●●●(GameObject* parent); //デストラクタ ~●●●(); //初期化 void Initialize() override; //更新 void Update() override; //描画 void Draw() override; //開放 void Release() override;};<ソースファイル> (●●●は好きな名前)
#include "●●●.h"//コンストラクタ●●●::●●●(GameObject * parent) :GameObject(parent, "●●●"){}//デストラクタ●●●::~●●●(){}//初期化void ●●●::Initialize(){}//更新void ●●●::Update(){}//描画void ●●●::Draw(){}//開放void ●●●::Release(){}このクラスの中に必要な処理を書いていくことになる。
・「コンストラクタ」にはメンバ変数の初期化。
・「Initialize」には変数の初期化以外で最初にやりたいこと。(ファイルのロードとか)
・「Update」には常にやりたいこと。(ボタンを押したら移動するとか)
・「Draw」には絵やモデルの描画処理。
・「Release」には開放処理(特別なことをしなければ特に書くことはない。)
を書いていく。
一番デフォルトなパターン。
<xxxシーンに●●●を追加する例> (太字部分のみ追加)
#include "xxxScene.h"#include "●●●.h"xxxScene::xxxScene(IGameObject * parent) : GameObject(parent, "xxxScene"){}void xxxScene::Initialize(){ Instantiate<●●●>(this);}作成したオブジェクトのヘッダーをインクルードして、Instatiate関数を呼ぶ。
< >の中にはゲームオブジェクトのクラス名、引数には「親」を指定する。
親をthisにすれば、このシーン(上の例だとxxxシーン)が親になる。
この関数は、Initializeにしか書けないわけではない。
弾丸のように任意のタイミングで登場させたい時は、その時に呼べばいい。
オブジェクトの親子関係をつけると、親が動けば子も動くようになる。
たとえば剣を持ったキャラが走ったら、当然剣も一緒に移動しないとおかしい。
こういうときは、剣をキャラの子にしてやればいい。
<Playerの子供としてSwordを登場させる例>
void Player::Initialize(){ Instantiate<Sword>(this);}Playerクラスの中でthisと書けば、それはプレイヤーを指すことになるので、プレイヤーが親になる。