首页 > 解决方案 > 我的碰撞检测中的奇怪行为

问题描述

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

我有一个“碰撞管理器”,它有一个方法“checkCollision”

Collision Manager 获得了 GameObject Manager 的指针,其中包含每个可碰撞对象的列表。

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

也许你能看到我的问题?

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

标签: c++listsdlcollision-detection

解决方案


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

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

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

解决方案是移动线路:

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

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


推荐阅读