如何测试两个矩形之间的碰撞,一个具有多个类的实例?

时间:2014-01-20 18:35:38

标签: java logic lwjgl

这更像是一个逻辑问题,而不是代码,我相信。

我有两个矩形(类“RedBlock”),由“Main.blocks []”引用,另一个矩形(类“MainCharacter”),其代码来自此类。类“MainCharacter”的矩形在与“Block”数组中的任何一个矩形(名为“blocks”)发生碰撞时应停止移动。因为它处于“for”循环中,所以块内的任何“if”语句必须对于“Block”的两个实例都为真,以保持“MainCharacter”不移动。此外,由于代码运行两次,所以“ MovementSpeed“似乎加倍,由”setX()“方法被调用两次。

因此,我的问题是我不能测试两个块之一之间的冲突,而是同时只检测两个块之间的冲突,并且我无法准确控制“MainCharacter”的速度(因为它相对于块数)。你能告诉我我做错了什么吗?如果您手头有一种优质的碰撞检测形式,请随意在答案中加入。

    for (int i = 0; i <= Main.blocks.length - 1; i++) {
        if (Main.blocks[i] != null) {
            if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
                if (Math.abs(getRight() - Main.blocks[i].getLeft()) < movementSpeed
                        && getBottom() <= Main.blocks[i].getTop()
                        && getTop() >= Main.blocks[i].getBottom()) {
                    setX(getX() + Math.abs(getRight() - Main.blocks[i].getLeft()));
                } else {
                    setX(getX() + movementSpeed);
                }
            } else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
                if (Math.abs(getLeft() - Main.blocks[i].getRight()) < movementSpeed
                        && getBottom() <= Main.blocks[i].getTop()
                        && getTop() >= Main.blocks[i].getBottom()) {
                    setX(getX() - Math.abs(getLeft() - Main.blocks[i].getRight()));
                } else {
                    setX(getX() - movementSpeed);
                }
            } if (Keyboard.isKeyDown(Keyboard.KEY_S)) {
                if (Math.abs(getBottom() - Main.blocks[i].getTop()) < movementSpeed
                        && getLeft() <= Main.blocks[i].getRight()
                        && getRight() >= Main.blocks[i].getLeft()) {
                    setY(getY() - Math.abs(getBottom() - Main.blocks[i].getTop()));
                } else {
                    setY(getY() - movementSpeed);
                }
            } else if (Keyboard.isKeyDown(Keyboard.KEY_W)) {
                if (Math.abs(getTop() - Main.blocks[i].getBottom()) < movementSpeed
                        && getLeft() <= Main.blocks[i].getRight()
                        && getRight() >= Main.blocks[i].getLeft()) {
                    setY(getY() + Math.abs(getTop() - Main.blocks[i].getBottom()));
                } else {
                    setY(getY() + movementSpeed);
                }
            }
        } else return;
    }

1 个答案:

答案 0 :(得分:0)

为什么要在键盘事件中调用事件?为什么不直接检查块[i] .leftrighttop并从块[i + 1]向下移动,然后将其移回到它向内行进的距离,例如。

for(int i = 0; i < Main.blocks.length - 2/*Because we will be checking i +1*/; i ++){
if((Main.blocks[i].left > Main.blocks[i+1].left)&&(Main.blocks[i].left < Main.blocks[i+1].left)){}
}

将检查块的x位置...现在你可以告诉它移动到最近的点并为其余的点做同样的事情:)希望它有所帮助!我总是在delphi7中做到这一点。