Java游戏编程:一个对象的多个实例,对待相同的方式?

时间:2012-10-22 21:49:34

标签: java coding-style

很抱歉,如果标题没有多大意义。我正在Java Eclipse中制作一个Chip's Challenge风格的游戏,其中特殊的东西,如玩家,硬币和可推动的块是一个类。可推送块和播放器之间的交互需要大量的冲突检测逻辑,并且代码变得非常糟糕,因为我必须对类的每个实例进行相同的逻辑检查。例如:

public void pb1TouchingBaddy() {

    if (pb1.getTileX() == b1.getTileX() & pb1.getTileY() == b1.getTileY()) {
        if (b1.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b1.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b1.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b1.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b2.getTileX() & pb1.getTileY() == b2.getTileY()) {
        if (b2.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b2.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b2.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b2.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b3.getTileX() & pb1.getTileY() == b3.getTileY()) {
        if (b3.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b3.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b3.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b3.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

    if (pb1.getTileX() == b4.getTileX() & pb1.getTileY() == b4.getTileY()) {
        if (b4.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b4.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b4.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b4.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }

因为你可以看到if语句的这三个块都是完全相同的逻辑,只适用于同一个对象的不同实例。有没有办法写这个而不必重复自己这么多?我能够将四个方向运动逻辑变成一个方法,并认为我有一段时间的天才,但我无法弄清楚如何做同样的事情,但同一个对象的多个实例。现在,在我感到困惑之前,我只停留在两个可推动的块中,而不能为另一个块做逻辑。非常感谢任何建议,谢谢!

3 个答案:

答案 0 :(得分:2)

将这些方法放在一个接口中,并使它们全部实现该接口。

让你的方法只对那个界面感兴趣,而不是担心实际的具体类型是什么。

答案 1 :(得分:2)

private function move(PBClass pb1, PBClass pb2, BClass b) {
    if (pb1.getTileX() == b.getTileX() & pb1.getTileY() == b.getTileY()) {
        if (b.getbUp() == 1 & pb1.getTileY() - 1 != pb2.getTileY()) {
            pb1.move(0, -1);
        } else if (b.getbDown() == 1
                & pb1.getTileY() + 1 != pb2.getTileY()) {
            pb1.move(0, 1);
        } else if (b.getbRight() == 1
                & pb1.getTileX() + 1 != pb2.getTileX()) {
            pb1.move(1, 0);
        } else if (b.getbLeft() == 1
                & pb1.getTileX() - 1 != pb2.getTileX()) {
            pb1.move(-1, 0);
        }
    }
}

public void pb1TouchingBaddy() {
    move(pb1, pb2, b1);
    move(pb1, pb2, b2);
    move(pb1, pb2, b3);
    move(pb1, pb2, b4);
}

当然,您需要将PBClassBClass替换为您的实际班级名称。

如果你有一个对象数组:

PBClass[] listPB = { pb1, pb2, pb3, pb4};
BClass[] listB = { b1, b2, b3, b4};

public void pb1TouchingBaddy() {
    for (int i=0; i < listPB.length - 1; i+=2) {
        for (int j=0; j < listB.length; j++) {
            move(pb[i], pb[i+1], b[j]);
        }
    }
}

或者您可以以相同的方式使用ArrayList

答案 2 :(得分:2)

您需要某种Iterable集合。这样你就可以循环使用它。