図0202a
ObjectInterfaceはOnCreate()関数、 OnPreCreate()関数、OnEvent()関数を持つ派生クラスを作成するためのインターフェイスです。このほかにGetThis()テンプレート関数により、自分自身のshared_ptrを返すことができます。
//ステージ内の更新(シーンからよばれる) void Stage::UpdateStage() { //追加・削除まちオブジェクトの追加と削除 SetWaitToObjectVec(); //Transformコンポーネントの値をバックアップにコピー for (auto ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { auto ptr2 = ptr->GetComponent<Transform>(); ptr2->SetToBefore(); auto RigidPtr = ptr->GetComponent<Rigidbody>(false); if (RigidPtr) { //Rigidbodyがあればフォースを初期化 RigidPtr->SetForce(0, 0, 0); } } } //配置オブジェクトの更新処理 for (auto ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->OnUpdate(); } } //自身の更新処理 if (IsUpdateActive()) { OnUpdate(); } //配置オブジェクトのコンポーネント更新 for (auto ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->ComponentUpdate(); } } //衝突判定の更新(ステージから呼ぶ) UpdateCollision(); //衝突判定のメッセージ発行(ステージから呼ぶ) UpdateMessageCollision(); //配置オブジェクトの更新後処理 for (auto ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->OnUpdate2(); } } //自身の更新1 if (IsUpdateActive()) { OnUpdate2(); } //自身のビューをアップデート auto ViewPtr = GetView(false); if (ViewPtr && ViewPtr->IsUpdateActive()) { ViewPtr->OnUpdate(); } //コリジョンのリセット for (auto ptr : GetGameObjectVec()) { ptr->CollisionReset(); } //子供ステージの更新 for (auto PtrChileStage : GetChileStageVec()) { PtrChileStage->UpdateStage(); } }
template<typename T, typename... Ts> shared_ptr<T> AddGameObject(Ts&&... params) { try { auto Ptr = ObjectFactory::Create<T>(GetThis<Stage>(), params...); PushBackGameObject(Ptr); return Ptr; } catch (...) { throw; } }
PushBackGameObject(Ptr);
SetWaitToObjectVec();
Stage::RemoveGameObject<ゲームオブジェクト型>(ゲームオブジェクトポインタ)
1、基本的に別のゲームオブジェクトのshared_ptrを保持しない。 2、保持せずにSetSharedGameObject()関数、GetSharedGameObject()関数で使うときに取得する。 3、どうしても保持したければweak_ptrで保持し、使用の都度lock()で有効かどうかチェックする。
class TestObject : public GameObject { public: //構築と破棄 TestObject(const shared_ptr<Stage>& StagePtr); virtual ~TestObject(){} //初期化 //OnCreate()関数は何もしない virtual void OnCreate() override{} //WithParamによる初期化(仮想関数でなくてよい) void OnCreateWithParam(const Vec3& Pos); //中略 };
//コンストラクタ TestObject::TestObject(const shared_ptr<Stage>& StagePtr): GameObject(StagePtr) {} //WithParamによる初期化(仮想関数でなくてよい) void TestObject::OnCreateWithParam(const Vec3& Pos){ auto PtrTransform = AddComponent<Transform>(); PtrTransform->SetPosition(Pos); PtrTransform->SetScale(1.0f, 1.0f, 1.0f); PtrTransform->SetRotation(0.0f, 0.0f, 0.0f); }
AddGameObjectWithParam<TestObject>(Vec3(0.0f, 0.5f, 5.0f));
//プレーヤーの作成 auto PlayerPtr = AddGameObject<Player>(); //シェア配列にプレイヤーを追加 SetSharedGameObject(L"Player", PlayerPtr);
auto PtrPlayer = GetStage()->GetSharedGameObject<Player>(L"Player", false); if (PtrPlayer) { //見つかった場合の何かの処理 } else{ //見つからなかった場合の何かの処理 }
auto PtrPlayer = GetStage()->GetSharedGameObject<Player>(L"Player"); auto PtrTrans = PtrPlayer->GetComponent<Transform>();
//Enemyのグループを作成する CreateSharedObjectGroup(L"EnemyGroup");
auto EnemyPtr = AddGameObject<Enemy>(); auto Group = GetSharedObjectGroup(L"EnemyGroup"); Group->IntoGroup(EnemyPtr);
auto Group = GetStage()->GetSharedObjectGroup(L"EnemyGroup"); for (auto& v : Group->GetGroupVector()) { auto shptr = v.lock(); if (shptr) { auto EnemyPtr = dynamic_pointer_cast<Enemy>(shptr); //EnemyPtrを使った何かの処理 } }
//ステージ内のすべての描画(シーンからよばれる) void Stage::RenderStage() { //描画デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto MultiPtr = dynamic_pointer_cast<MultiView>(GetView()); if (MultiPtr) { for (size_t i = 0; i < MultiPtr->GetViewSize(); i++) { MultiPtr->SetTargetIndex(i); if (IsShadowmapDraw()) { Dev->ClearShadowmapViews(); Dev->StartShadowmapDraw(); DrawShadowmapStage(); Dev->EndShadowmapDraw(); } //デフォルト描画の開始 Dev->StartDefaultDraw(); RsSetViewport(MultiPtr->GetTargetViewport()); DrawStage(); //デフォルト描画の終了 Dev->EndDefaultDraw(); } //描画が終わったら更新処理用に先頭のカメラにターゲットを設定する MultiPtr->SetTargetIndex(0); } else { if (IsShadowmapDraw()) { Dev->ClearShadowmapViews(); Dev->StartShadowmapDraw(); DrawShadowmapStage(); Dev->EndShadowmapDraw(); } //デフォルト描画の開始 Dev->StartDefaultDraw(); RsSetViewport(GetView()->GetTargetViewport()); DrawStage(); //デフォルト描画の終了 Dev->EndDefaultDraw(); } //子供ステージの描画 for (auto PtrChileStage : pImpl->m_ChildStageVec) { PtrChileStage->RenderStage(); } }