所以,我有一个基类PhysicsObject
,一个子类Colliding
,以及两个再次派生的类,Static
和Newtonian
。
检查碰撞时,我将所有碰撞写入std::vector< std::pair< Colliding*, Colliding*> > collisionVector
。 (碰撞检测是相当基本的,并不是问题的真正部分。)
现在,在检测到所有冲突后,我迭代collisionVector
并调用静态collide
方法,该方法有四个重载:
void collide(Newtonian* first, Newtonian* second);
void collide(Newtonian* object, Static* obstacle);
inline void collide(Static* obstacle, Newtonian* object){ collide(object, obstacle); }
void collide(Static* first, Static* second);
问题是我必须检查我每次处理的对象类型,并且我可能会引入更多Colliding
的子类。
如何以简单的方式决定调用哪个重载?
这是我的代码目前的样子。不漂亮。
for (pair<Collision*,Collision*> coll : collisionVector){
Colliding* first = get<0>(coll);
Colliding* second = get<1>(coll);
if (Newtonian* firstNewt = dynamic_cast<Newtonian*>(first)){
if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){
collide(firstNewt, secNewt);
}
else if(Static* secStat = dynamic_cast<Static*>(second)){
collide(firstNewt, secStat);
}
}
else if(Static* firstStat = dynamic_cast<Static*>(first)){
if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){
collide(firstStat, secNewt);
}
else if(Static* secStat = dynamic_cast<Static*>(second)){
collide(firstStat, secStat);
}
}
}
答案 0 :(得分:1)
我不知道是否有一个简单的C ++技巧可以帮助你(你需要的是两个对象的虚拟函数分辨率......)。
如果您只需处理2种具体类型(牛顿和静态),我会保留您已有的代码。如果你想支持更多类型,你需要使你的代码更通用,这样你就不会编写N ^ 2个案例。
我会实现某种碰撞处理注册,您可以在其中注册两种具体类型和处理它们的方法。但这并不容易。