c++ - 我的碰撞检测中的奇怪行为
问题描述
我正在尝试检测多个对象之间的碰撞。但是我的列表迭代似乎出错了,我不知道为什么。它必须是一个简单的问题。
我有一个“碰撞管理器”,它有一个方法“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++;
}
解决方案
您的问题来自这样一个事实,即迭代器在迭代bIt
外循环(带有 的那个aIt
)时永远不会被重置。让我们分步分解您的代码:
- 在两个嵌套循环之前将迭代器初始化到列表的开头。
- 您输入外循环(带有 的循环
aIt
)并选择a
作为列表的第一个对象 - 您进入内部循环,您的迭代器
bIt
将遍历所有对象的列表。 - 在内部循环结束时,您的迭代器
bIt
不会重置到游戏对象列表的开头并保持在其最后一个值:列表的末尾。
因此,您永远不会第二次进入内部循环。
解决方案是移动线路:
this->bIT = this->goManager->GBList.begin();
在外循环内部,所以在第一个while
.
推荐阅读
- node.js - Angular 从 JSON 获取数据到模型并列出它
- django - 如何在 django 中创建一个日志数据库来记录创建、更新或删除对象的用户?
- sql - 有没有更好的方法来优先考虑子查询而不是使用 TOP?
- javascript - FullCalendar:在调用 RestAPI 调用后将 JSON 数据与 initialEvents 绑定
- flutter - 如何用未来 Http Post 的结果显示 Snackbar?
- python - Python数据框操作
- windows - 无法启动 Minikube - 使用 HyperV
- c# - 指定 B2C 策略(在 C# 中)的顺序是否重要?
- database - 如何使用聚合在 mongodb 中获取选定字段的值大小
- python - 用于 jsonb 字符串列表的 Postgresql SQLalchemy 过滤器查询