Java游戏编程: multiple instances of an object,对待方式一样吗?

标签 java coding-style

抱歉,如果标题没有多大意义。我正在 Java Eclipse 中制作 Chip's Challenge 风格的游戏,其中玩家、硬币和可推 block 等特殊事物是一类。可推 block 和玩家之间的交互需要大量的碰撞检测逻辑,而且代码变得很糟糕,因为我必须对类的每个实例进行相同的逻辑检查。例如:

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 语句 block 都是完全相同的逻辑,只是应用于同一对象的不同实例。有没有什么办法可以不用重复这么多来写这个?我能够将四个方向的运动逻辑转化为一个方法,有一段时间我认为自己是个天才,但我不知道如何做类似的事情,但使用同一对象的多个实例。现在,在我变得非常困惑并且无法为另一个 block 做逻辑之前,我只被两个可插入 block 卡住了。非常感谢任何建议,谢谢!

最佳答案

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

关于Java游戏编程: multiple instances of an object,对待方式一样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13020458/

相关文章:

java - 实时 Java 规范

python - 更重要的是pythonic : trivial lambda or None?

JavaScript 风格推荐

C++:模板参数循环依赖

c++ - C++ 头文件中#ifdef __linux 和#ifdef __unix 的区别

java - 在 linux 上安装 JDK7

java - 读取浏览器cookie lambda代理java

java - Jackson JSON解析映射转换

java - 如何上传根文件夹中的图像?

python - 三元返回/赋值与传统 if-else block 的比较