[英]How do I implement a collision response between two non-rotatable rectangles
[英]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.