考虑以下:有一个abstract class Collider
和一些更类,扩展此类例如RectCollider
和CircleCollider
。这些多个实例都在同一List<Collider> colliders
。
现在,我的问题是,我应该怎么接近检查这些撞机之间的碰撞,同时保持它们之间的兼容性。例如,我要检查一个RectCollider
和检查RectCollider
和RectCollider
另一CircleCollider
不同之间的冲突。
我的想法至今使用的方法来检查哪些类型的对撞机是(通过的instanceof),然后调用根据结果不同的方法:
public Collision getCollision(Collider a, Collider b) {
if(a instanceof RectCollider) {
if (b instanceof CircleCollider) {
return rectCircle(a, b);
}
else if (b instance of RectCollider) {
return rectRect(a, b);
}
}
else if(a instanceof CirlceCollider) {
if (b instanceof CircleCollider) {
return cirlceCircle(a, b);
}
else if (b instance of RectCollider) {
return rectCircle(b, a);
}
}
else {
return null;
}
}
该方法调用此方法的时刻:
getCollision(colliders.get(i), colliders.get(i+1));
但是,我不知道这是否真的是最快/最好的方法,因为这种方法变得过于复杂增加了更多的对撞机类型时,真正的快速。
这样一来,当你添加新的子类的方法大小尺度平方。您是否可以简单地这样,取决于您呼叫(rectRect,rectCircle等)的方法。
是不是所有的这些方法不相关的,还是与相同形状的每个方法都有一个共同的行为?在前一种情况下,你的运气了。在后一种情况下,你可能希望定义在对撞机的子类这种行为,并添加提取这种行为的一般方法。那么这可能是固定的大小,e.g的:
public Collision getCollision(Collider a, Collider b) {
Force f1 = a.getCollisionInfo();
Force f2 = b.getCollisionInfo();
return new Collision(f1, f2);
}
关于执行性能,也没关系。 JVM的优化都是为你。