java - 如何简化多个IF语句?

标签 java android libgdx game-development

我正在用 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/

相关文章:

java - 从变量字符串中获取单词部分

java - Web服务错误: 404 Not found - No context found for request

android - 使用 Dagger 2 将上下文或 Activity 传递给适配器

android - 在方向变化时更新应用程序小部件

java - 如何沿着特定轨迹放置物体?

libgdx - 在 Libgdx 中使用 1 种字体制作不同字体大小的 BitmapFont

java - 使用 Eclipse 的 ClassNotFoundException/NoClassDefFoundError

java - 计算当前路径上的任意节点到指定节点的最大距离?

android - 在 Android Q 10 上检测 SIM 卡更改

android - batch.begin() 处的空指针异常 LibgDDX