2017-11-23 6 views
0

私が作っているゲームのエンティティマネージャを作成しようとしているので、ゲーム内のすべてのエンティティ(プレイヤー、敵、オブジェクト)を簡単に管理でき、それらのUpdateとRenderの機能を手動で行う必要はありません。 エンティティがマップに追加されているときはいつでも、彼らはまた、そのIDが追加されていると、ランダムなIDを与えられるだろう、私はint型にかかるマップとEntityクラスC++ - マップには多すぎる要素が含まれています

std::map<int, Entity*> entities; 

を使用してエンティティを記録していますベクトルはちょうどので、私は

IDS = std::vector<int>(); 

void EntityManager::AddEntity(Entity* entity) 
{ 
int ID = rand(); 
for(int i = 0; i < IDS.size(); i++) 
{ 
    if(IDS[i] == ID) 
    { 
     ID = rand(); 
     i = 0; 
    } 
} 

entities.insert(pair<int, Entity*>(ID, entity)); 
} 

私は最終的に各エンティティの機能を更新を呼び出すとレンダーまったく同じエンティティを使用して終了していないので、IDのは、使用されていたものを記録することができます

void EntityManager::Update(float deltaTime) 
{ 
if(!entities.empty()) 
{ 
    for(int i = 0; i < entities.size(); i++) 
    { 
     if(entities[i] != nullptr) 
     { 
      entities[i]->Update(deltaTime); 
     } 
    } 
} 
} 

void EntityManager::Render() 
{ 
if(!entities.empty()) 
{ 
    for(int i = 0; i < entities.size(); i++) 
    { 
     if(entities[i] != nullptr) 
     { 
      entities[i]->Render(); 
     } 
    } 
} 
} 

私が抱えている問題は、フレームレートが即座に2FPSのようなものに落ちることです。なぜなら、アップデートとレンダリングの機能内でマップのサイズをチェックしていると思われます。サイズは16587のようなものですこれはちょうど2で、私は地図に2つのエンティティを入力しています。 私は原因が何であるか把握しようとしましたが、見つからず、AddEntity関数の "entities.insert"の後のサイズは2ですが、UpdateおよびRender関数が呼び出されると、サイズは即座に16587またはそれに相当する数字です。

entityManager->AddEntity(player); 
entityManager->AddEntity(diamond); 
+2

マップ(ID)のキーがランダムである必要があるのはなぜですか?それを簡単な増分数(例えば1,2,3など)にする方が簡単ではないでしょうか? – Robb

+1

http://en.cppreference.com/w/cpp/container/map/operator_at –

答えて

5

entitiesmapで、あなたがキーとしてランダムな整数を使用している:私は別のクラス内のコンストラクタのどこを除くAddEntityを呼び出していませんよ。 は、マップのメンバーにアクセスするためにインデックスループを使用できません。ループが繰り返されるたびに、マップ内に別のエントリ(nullptrEntity)が追加され、ループが継続するサイズが増えます。マップを通して、あなたは、あなただけのマップ内のエントリを参照してくださいね

for (const auto &ent: entities) 
    ent.second->Render(); 

を使用して、新しいものを追加することはできません

は反復します。

+0

それを修正しました、ありがとうございます! :)なぜインデックスループは要素をマップに追加しますか? – codelyoko373

+1

@ codelyoko373 - なぜインデックスループが要素をマップに追加しますか? - 上記の私のコメントを参照してください。 http://en.cppreference.com/w/cpp/container/map/operator_at - 要するに、キーが挿入されていない場合はキーを挿入します。使用する関数に関するドキュメントを読む必要があります。 –

関連する問題