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

Weird behaviour in my collision Detection

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

我有一个 "Collision Manager" 有一个方法 "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++;
    }

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

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

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

解决方法是移动线:

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

在外循环中,所以 第一个 while.

之后