図0002a
ObjectInterfaceはOnCreate()関数、 OnPreCreate()関数、OnEvent()関数を持つ派生クラスを作成するためのインターフェイスです。このほかにGetThis()テンプレート関数により、自分自身のshared_ptrを返すことができます。
//ステージ内の更新(シーンからよばれる) void Stage::UpdateStage() { if (IsUpdatePerformanceActive()) { pImpl->m_UpdatePerformance.Start(); } //追加・削除まちオブジェクトの追加と削除 SetWaitToObjectVec(); //Transformコンポーネントの値をバックアップにコピー for (auto& ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { auto ptr2 = ptr->GetComponent<Transform>(); ptr2->SetToBefore(); } } //物理オブジェクトのフォースの初期化 if (IsPhysicsActive()) { pImpl->m_BasePhysics.InitForce(); } //配置オブジェクトの更新処理 for (auto& ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->OnUpdate(); } } //自身の更新処理 if (IsUpdateActive()) { OnUpdate(); } //物理オブジェクトの更新 if (IsPhysicsActive()) { pImpl->m_BasePhysics.Update(false); } //配置オブジェクトのコンポーネント更新 for (auto& ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->ComponentUpdate(); } } ////衝突判定 UpdateCollision(); //配置オブジェクトの更新後処理 for (auto& ptr : GetGameObjectVec()) { if (ptr->IsUpdateActive()) { ptr->OnUpdate2(); } } //自身の更新後処理 if (IsUpdateActive()) { OnUpdate2(); } //自身のビューをアップデート auto& ViewPtr = GetView(false); if (ViewPtr && ViewPtr->IsUpdateActive()) { ViewPtr->OnUpdate(); } //子供ステージの更新 for (auto& PtrChileStage : GetChileStageVec()) { PtrChileStage->UpdateStage(); } if (IsUpdatePerformanceActive()) { pImpl->m_UpdatePerformance.End(); } }
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 TestObject::OnCreate() { //中略 AddTag(L"TestObject"); //中略 }
void Player::OnUpdate() { //中略 vector<shared_ptr<GameObject>> ObjVec; GetStage()->GetUsedTagObjectVec(L"TestObject",ObjVec); }
void Player::OnCollisionEnter(shared_ptr<GameObject>& Other) { if (Other->FindTag(L"TestObject")) { //TestObjectタグを持った相手と衝突した //...何かの処理 } }
//ステージ内のすべての描画(シーンからよばれる) void Stage::RenderStage() { if (IsDrawPerformanceActive()) { pImpl->m_DrawPerformance.Start(); } //描画デバイスの取得 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(); #if (BASECROSS_DXVERSION == 11) RsSetViewport(MultiPtr->GetTargetViewport()); #endif DrawStage(); //デフォルト描画の終了 Dev->EndDefaultDraw(); } //描画が終わったら更新処理用に先頭のカメラにターゲットを設定する MultiPtr->SetTargetIndex(0); } else { if (IsShadowmapDraw()) { Dev->ClearShadowmapViews(); Dev->StartShadowmapDraw(); DrawShadowmapStage(); Dev->EndShadowmapDraw(); } //デフォルト描画の開始 Dev->StartDefaultDraw(); #if (BASECROSS_DXVERSION == 11) RsSetViewport(GetView()->GetTargetViewport()); #endif DrawStage(); //デフォルト描画の終了 Dev->EndDefaultDraw(); } //子供ステージの描画 for (auto PtrChileStage : GetChileStageVec()) { PtrChileStage->RenderStage(); } if (IsDrawPerformanceActive()) { pImpl->m_DrawPerformance.End(); } }