我有一个继承自基类Character
的类CollidableObject
。正如您可能已经猜到的那样,CollidableObject
可以检测其他CollidableObject
之间的冲突,例如CircleCollidableObject
和SquareCollidableObject
。
bool CollidableObject::collidesWith(std::shared_ptr<CollidableObject> &pCollidable)
{
...
}
我用它来运行其他检查,并最终处理碰撞。基本上我希望能够遍历游戏中的角色,传入两个Character
(再次,继承自CollidableObject
),并检测任何碰撞。
void CharacterManager::collisions()
{
for(std::vector<std::shared_ptr<Character>>::iterator i = mCharacters_.begin(); i != mCharacters_.end(); i++) {
for(std::vector<std::shared_ptr<Character>>::iterator j = mCharacters_.begin(); j != mCharacters_.end(); j++) {
if(i == j) continue;
(*i)->collidesWith(*j);
...
}
如果我不需要,我宁愿不将mCharacters_
向量转换为CollidableObjects
的向量。但我不确定这是否是唯一的方法。
答案 0 :(得分:3)
你可以改写界面吗?拥有:
并没有错bool CollidableObject::collidesWith(const CollidableObject* pCollidable)
据推测,collidesWith
不会获取您传入的指针的所有权,因此传入原始指针就可以了。
尽管如此,shared_ptr<CollidableObject>
实际上可以从shared_ptr<Character>
构建。因此,如果您想要shared_ptr
,则必须通过 const 引用而不是引用来获取它。那就是:
bool CollidableObject::collidesWith(const std::shared_ptr<CollidableObject>& p)
或仅按值:
bool CollidableObject::collidesWith(std::shared_ptr<CollidableObject> p)
参见this reference的构造函数#9。
如果你正在使用std::shared_ptr
,你至少应该在循环中使用auto
来减少冗长。 j
循环可以从i
开始,以避免重复检查每对:
for (auto i = mCharacters_.begin(); i != mCharacters_.end(); ++i) {
for (auto j = std::next(i); j != mCharacters_.end(); ++j) {
(*i)->collidesWith(j->get());
...
}
}