我的碰撞检测中的奇怪行为



我正在尝试检测多个对象之间的碰撞。但是我的列表迭代似乎工作错误,我不知道为什么。这必须是一个简单的问题。

我有一个"碰撞管理器",它有一个方法"检查碰撞">

碰撞管理器获取游戏对象管理器的指针,该指针包含每个可碰撞对象的列表。

我觉得我的列表迭代做错了什么。

也许你能看到我的问题?

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++;
}

您的问题来自这样一个事实,即迭代器bIt在迭代外部循环(带有aIt的循环(时永远不会重置。让我们分步骤分解您的代码:

  • 将迭代器初始化到两个嵌套循环之前的列表开头。
  • 您进入外部循环(带有aIt的循环(并选择a作为列表的第一个对象
  • 您进入内部循环,迭代器bIt遍历所有对象的列表。
  • 在内部循环结束时,迭代器bIt不会重置到游戏对象列表的开头,而是停留在其最后一个值:列表的末尾。

因此,您永远不会第二次进入内部循环。

解决方案是移动行:

this->bIT = this->goManager->GBList.begin();

在外循环内,所以第一次while之后.

最新更新