我正在尝试检测多个对象之间的冲突。但是我的列表迭代似乎工作不正确,我不知道为什么。它必须是一个简单的问题。
我有一个“冲突管理器”,它具有方法“ checkCollision”
“碰撞管理器”获得了“游戏对象管理器”的指针,该指针具有一个列出每个可碰撞对象的列表。
我感觉自己的列表迭代做错了什么。
也许您能够看到我的问题?
void collisionManager::checkCollision()
{
this->aIT = this->goManager->GBList.begin();
this->bIT = this->goManager->GBList.begin();
SDL_Rect * result = new SDL_Rect();
while (this->aIT != this->goManager->GBList.end())
{
GameObject * a = *this->aIT;
while (this->bIT != this->goManager->GBList.end())
{
GameObject * b = *this->bIT;
if (a != b)
{
SDL_Rect * result = new SDL_Rect();
if (SDL_IntersectRect(a->collider->collisionBox, b->collider->collisionBox, result))
{
a->onCollide(b);
b->onCollide(a);
}
else {
}
}
else
{
a->onCollide(b);
}
this->bIT++;
}
this->aIT++;
}
答案 0 :(得分:0)
您的问题来自以下事实:迭代器bIt
在外循环(带有aIt
的循环)永不重置。让我们按步骤分解代码:
aIt
的循环),然后选择a
作为列表的第一个对象bIt
遍历所有对象的列表。bIt
不会 not 重置为游戏对象列表的开头,并保持在其最后一个值:列表结尾。 因此,您再也不会进入内循环了。
解决方案是移动该行:
this->bIT = this->goManager->GBList.begin();
位于外部循环内部,因此位于之后是第一个while
。