Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何测试两个矩形之间的冲突,一个矩形具有其类的多个实例?_Java_Logic_Lwjgl - Fatal编程技术网

Java 如何测试两个矩形之间的冲突,一个矩形具有其类的多个实例?

Java 如何测试两个矩形之间的冲突,一个矩形具有其类的多个实例?,java,logic,lwjgl,Java,Logic,Lwjgl,我相信这更多的是逻辑问题,而不是代码问题 我有两个矩形(属于“RedBlock”类),由“Main.blocks[]”引用,还有一个矩形(属于“MainCharacter”类),这段代码来自于它的类。类“MainCharacter”的矩形在与“Block”数组(名为“blocks”)中的任一矩形冲突时应停止移动。由于它处于“for”循环中,块内的任何“if”语句对于“block”的两个实例都必须为true,以防止“main character”移动。此外,由于代码运行两次,“movementSp

我相信这更多的是逻辑问题,而不是代码问题

我有两个矩形(属于“RedBlock”类),由“Main.blocks[]”引用,还有一个矩形(属于“MainCharacter”类),这段代码来自于它的类。类“MainCharacter”的矩形在与“Block”数组(名为“blocks”)中的任一矩形冲突时应停止移动。由于它处于“for”循环中,块内的任何“if”语句对于“block”的两个实例都必须为true,以防止“main character”移动。此外,由于代码运行两次,“movementSpeed”似乎加倍,这是由“setX()”方法被调用两次引起的

因此,我的问题是,我无法测试两个块中的一个块之间的碰撞,而只能同时测试两个块之间的碰撞,并且我无法准确控制“主字符”的速度(因为它与块的数量有关).你能告诉我我做错了什么吗?如果你手头有一种更好的碰撞检测方法,请在你的回答中包括这一点

    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;
    }

for(int i=0;i为什么要在键盘事件中调用该事件?为什么不选中块[i]。从块[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)){}
}
for(int i=0;iMain.blocks[i+1].left)&&(Main.blocks[i].left
这将检查块的x位置…现在你可以告诉它移动到最近的点,并对其余的点执行相同的操作:)希望有帮助!我总是在delphi7中这样做