首先,我建议您不要使用像
std::vector这样的数据结构,如果您想删除一个随机位置上的单个元素。此操作的复杂度是
线性的,取决于删除元素后的元素数量。
据我所知,您有许多敌人在2D屏幕上并排移动,与一个或多个玩家一起。如果敌人被玩家击中或跑出屏幕,它将被删除。您只需循环遍历敌人列表以满足这些条件。
在这种情况下,我建议您使用
std::map来管理创建的敌人对象。
假设您的敌人类具有检查删除条件的函数,例如:
bool Enemy::willbeDeleted() /* if true then will be deleted */
那么这里有一个使用 std::map 管理敌人对象的类:
EnemyManager.hpp
#include <map>
class EnemyManager {
public:
static EnemyManager& Instance();
static void deleteInstance();
public:
void createEnemy();
void checkEnemy();
virtual ~EnemyManager();
private:
EnemyManager();
EnemyManager(const EnemyManager& objManager);
static EnemyManager* enemyManager;
private:
std::map<int, A*> enemyList_;
int enemyIndex_;
};
EnemyManager.cpp
#include "EnemyManager.hpp"
#include <vector>
EnemyManager* EnemyManager::enemyManager = 0;
EnemyManager& EnemyManager::Instance()
{
if (0 == enemyManager)
{
enemyManager = new EnemyManager();
}
return *enemyManager;
}
void EnemyManager::deleteInstance()
{
if (0 != enemyManager) delete enemyManager;
}
EnemyManager::EnemyManager() : enemyList_(), enemyIndex_(0)
{}
EnemyManager::~EnemyManager() {
}
void EnemyManager::createEnemy()
{
enemyList_[enemyIndex_] = new Enemy();
++enemyIndex_;
}
void EnemyManager::checkEnemy()
{
std::map<int, A*>::const_iterator itb = enemyList_.begin(),
ite = enemyList_.end(), it;
std::vector<int> enemyToDelete;
for (it = itb; it != ite; ++it)
if ((it->second)->willbeDeleted())
enemyToDelete.push_back(it->first);
for (std::size_t idx = 0; idx < enemyToDelete.size(); ++idx)
{
delete enemyList_[enemyToDelete[idx]];
enemyList_.erase(enemyToDelete[idx]);
}
}
您可以按照以下方式使用此类:
在main.cpp中
EnemyManager& enemyManager = EnemyManager::Instance();
if(rand() % 1000 > 998)
{
/* Create new enemy */
enemyManager.createEnemy();
}
/* Check all enemies */
enemyManager.checkEnemy();
有两个重要的函数:createEnemy控制着创建新 Enemy 对象的方式,checkEnemy验证对象并在需要时删除它们,enemyList_ 的大小不会永远增加 :)
我相信通过这种方法,删除敌人不会再减慢您的程序。
这种方法的一个缺点是创建的对象数量可能会受到 2^(8*sizeof(enemyIndex_)) 的限制。
std::deque
或std::list
。此外,存储Enemy
对象而不是Enemy*
对象。不要使用手动动态内存分配。 - Konrad Rudolphvector<Enemy>
或vector<shared_ptr<Enemy>>
可以解决许多问题。 - M.Mdelete
的实际作用。但是,如果您在这里没有使用指针(和适当的数据结构;请参见上文),那么您首先就不会遇到这个问题。 - Konrad Rudolph