我的碰撞检测中的行为异常

时间:2018-08-13 13:54:26

标签: c++ list sdl collision-detection

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

我有一个“冲突管理器”,它具有方法“ 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++;
    }

1 个答案:

答案 0 :(得分:0)

您的问题来自以下事实:迭代器bIt在外循环(带有aIt的循环)永不重置。让我们按步骤分解代码:

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

因此,您再也不会进入内循环了。

解决方案是移动该行:

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

位于外部循环内部,因此位于之后是第一个while