繁体   English   中英

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

[英]How do I test collision between two rectangles, one with multiple instances of its class?

我确实认为,这更多是逻辑问题,而不是代码问题。

我有两个矩形(“ RedBlock”类),由“ Main.blocks []”引用,另一个矩形(“ MainCharacter”类),此代码来自于该矩形。 当“ MainCharacter”类的矩形与“块”数组中的两个矩形(称为“块”)碰撞时,应停止移动。 由于该代码处于“ for”循环中,因此该代码块中的所有“ if”语句对于“ Block”的两个实例都必须为true,以防止“ MainCharacter”移动。此外,由于代码运行了两次,因此“由于“ setX()”方法被调用了两次,导致“ speedSpeed”似乎翻了一番。

因此,我的问题是,我无法测试两个块之一之间的碰撞,而只能同时测试两个块之间的碰撞,并且我无法准确地控制“ 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;
    }

为什么在键盘事件中调用事件? 为什么不只检查block [i] .leftrighttop并从block [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 pos ...现在,您可以告诉它移动到最近的点,其余的都做同样的事情:)希望它能有所帮助! 我总是在delphi7中做到这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM