【发布时间】:2021-04-23 16:50:27
【问题描述】:
有一个抽象类Entity,其他类如Player和Enemy都继承自它。当游戏检测到实体之间发生碰撞时,会调用以下方法:
void handleCollision(Entity* ent1, Entity* ent2) {
if (dynamic_cast<Player*>(ent1) || dynamic_cast<Player*>(ent2) &&
dynamic_cast<Enemy*>(ent1) || dynamic_cast<Enemy*>(ent2)) {
//player <-> enemy collision
}
else if (dynamic_cast<Player*>(ent1) || dynamic_cast<Player*>(ent2) &&
dynamic_cast<Projectile*>(ent1) || dynamic_cast<Projectile*>(ent2)) {
//player <-> projectile collision
}
else if () {
//...
}
else if() {
//...
}
}
每个实体在与另一个实体发生碰撞时都有独特的行为,这取决于实体的类型(玩家、敌人等),这就是为什么我需要检查实体之间每个可能的组合,如上所示。但我不喜欢它创建一个巨大的 else if 链,每个实体都被检查多次的事实。还有其他方法吗?
【问题讨论】:
-
你不想在这里upcasting,那些都是低调的......
-
阅读“多重虚拟调度”
-
不要使用动态转换。使用虚函数。
-
或者
std::unordered_map<std::pair<std::type_info, std::type_info>, std::function<void(Entity*, Entity*)>> -
我怀疑那些
if’声明并没有达到它们的预期目的。a || b && c || d被编译为就像写成a || (b &&c) || d一样。我猜它应该是(a || b) && (c || d)。
标签: c++ dynamic-cast multiple-dispatch