我的碰撞检测中的奇怪行为
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
.
之后
我正在尝试检测多个对象之间的碰撞。但是我的列表迭代似乎出错了,我不知道为什么。这一定是一个简单的问题。
我有一个 "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
的循环)并且selecta
作为列表的第一个对象 - 您进入内部循环,您的迭代器
bIt
遍历所有对象的列表。 - 在内循环结束时,您的迭代器
bIt
不会 而不是 重置为游戏对象列表的开头并保持其最后一个值:列表的末尾。
因此您永远不会进入第二次内循环。
解决方法是移动线:
this->bIT = this->goManager->GBList.begin();
在外循环中,所以 在 第一个 while
.