我正在用 Java 编写一个简单的小行星游戏。并找到这个问题(不是真正的问题,我的解决方案工作完美,但看起来很丑)。我只是想知道有没有办法简化我的代码。
我的游戏中有一些对象。船、 meteor 、子弹和硬币。它们都是GameObject的子类。为了处理碰撞,在 MyGame 类中我有这些函数。
private void ship_hit_meteor(Ship ship, Meteor meteor){}
private void bullet_hit_meteor(Bullet bullet, Meteor meteor){}
private void ship_hit_coin(Ship ship, Coin coin){}
//...and so on
为了进行碰撞检查,我将所有对象放入 1 个大 objArray 中。 然后我迭代数组来检查碰撞。我是这样做的:但想象一下,如果我有 100 种类型的对象。
//inside the collision loop
GameObject a = objArray[i];
GameObject b = objArray[j];
if(a instanceof Ship && b instanceof Meteor ){
ship_hit_meteor((Ship)a, (Meteor)b);
}
else if(a instanceof Meteor && b instanceof Ship){
ship_hit_meteor((Ship)b, (Meteor)a);
}
else if(a instanceof Bullet && b instanceof Meteor){
bullet_hit_meteor((Bullet)a, (Meteor)b);
}
else if(a instanceof Meteor && b instanceof Bullet){
bullet_hit_meteor((Bullet)b, (Meteor)a);
}
//... end of the loop
有什么办法可以简化这个吗?
谢谢。
最佳答案
如果您有 100 种类型的对象,您会发现自己编写了 5050 个方法,并且为每个对象类型组合编写了一个单独的方法。 (如果有 n 种类型,则公式为 n(n-1)+n
方法)。这甚至没有考虑如何分派(dispatch)给正确的人,这正是您在这里所苦苦挣扎的问题。
更好的方法是拥有一个通用的碰撞处理方法,该方法知道如何根据碰撞对象的属性处理所有碰撞。然后,这些属性可以表示为方法,以及允许碰撞逻辑操纵碰撞对象的方法。例如
public interface Collides {
// properties
int damageDealtOnImpact();
boolean isReward();
boolean isIndestructible();
boolean isDestroyedOnImpact();
// impact methods
void damage(int damage);
void destroy();
void split();
void changeCourse(Vector impactVector);
// ... and so on, whatever you need
}
这样,添加对象类型应该相对轻松。尽管有时新类型的对象可能需要新的属性。在这种情况下,您的通用碰撞处理方法将受到影响,并且您可能需要在现有对象上实现额外的属性。但它胜过添加 101 个新方法并分派(dispatch)给它们。
关于java - 如何简化多个IF语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58936737/