図1501a
図1501b
AbstractFactoryというパターンはFactory(いわゆる工場)クラスを選択することで、別のオブジェクトの組み合わせを作成するパターンです。
//-------------------------------------------------------------------------------------- // 親ファクトリー //-------------------------------------------------------------------------------------- class AbstractFactory : public GameObject { protected: //構築と破棄 AbstractFactory(const shared_ptr<Stage>& StagePtr) :GameObject(StagePtr) {} virtual ~AbstractFactory() {} //ビューの作成 void CreateViewLight(); //プレイヤーの作成 void CreatePlayer(); };
//-------------------------------------------------------------------------------------- // ファクトリー1 //-------------------------------------------------------------------------------------- class Factory1 : public AbstractFactory { public: //構築と破棄 Factory1(const shared_ptr<Stage>& StagePtr) : AbstractFactory(StagePtr) {} virtual ~Factory1() {} //初期化 virtual void OnCreate() override; };
void Factory1::OnCreate() { //ビューとライトの作成 CreateViewLight(); //配列の初期化 vector< vector<Vec3> > vecBox = { { Vec3(50.0f, 1.0f, 50.0f), Vec3(0.0f, 0.0f, 0.0f), Vec3(0.0f, -0.5f, 0.0f) }, }; //ボックスの作成 for (auto v : vecBox) { GetStage()->AddGameObject<FixedBox>(v[0], v[1], v[2]); } //配列の初期化 vector< vector<Vec3> > vecSp = { { Vec3(0.0f, 0.0f, 0.0f), Vec3(5.0f, 0.0f, 10.0f) }, { Vec3(0.0f, 0.0f, 0.0f), Vec3(-5.0f, 0.0f, 10.0f) }, { Vec3(0.0f, 0.0f, 0.0f), Vec3(5.0f, 0.0f, -10.0f) }, { Vec3(0.0f, 0.0f, 0.0f), Vec3(-.0f, 0.0f, -10.0f) }, }; //障害物球の作成 for (auto v : vecSp) { GetStage()->AddGameObject<FixedSphere>(1.0f, v[0], v[1]); } //オブジェクトのグループを作成する auto group = GetStage()->CreateSharedObjectGroup(L"ObjGroup"); //配列の初期化 vector<Vec3> vecSeek = { { 0, 0.125f, 10.0f }, { 10.0f, 0.125f, 0.0f }, { -10.0f, 0.125f, 0.0f }, { 0, 0.125f, -10.0f }, }; //追いかけるオブジェクトの作成 for (auto v : vecSeek) { GetStage()->AddGameObject<SeekObject>(v); } //配列の初期化 vector<Vec3> vecPursuit = { { 10.0f, 0.125f, 10.0f }, }; //追跡するオブジェクトの作成 for (auto v : vecPursuit) { GetStage()->AddGameObject<PursuitObject>(v); } //プレーヤーの作成 CreatePlayer(); }
//-------------------------------------------------------------------------------------- // ゲームステージクラス実体 //-------------------------------------------------------------------------------------- void GameStage::OnCreate() { try { //2分の1の確率の乱数を発生 if (rand() % 2) { AddGameObject<Factory2>(); } else { AddGameObject<Factory1>(); } } catch (...) { throw; } }