矩形重叠法libgdx
我尝试使用重叠方法来确定两个精灵是否碰撞,但由于某种原因,它根本不起作用。它总是返回false,即使我清楚地看到精灵之间发生碰撞 有趣的是,这不是第一次发生在我身上。我不知道为什么重叠方法不起作用 这是我的Hero类,它有一个名为isCollided的方法矩形重叠法libgdx,libgdx,collision-detection,collision,overlap,rectangles,Libgdx,Collision Detection,Collision,Overlap,Rectangles,我尝试使用重叠方法来确定两个精灵是否碰撞,但由于某种原因,它根本不起作用。它总是返回false,即使我清楚地看到精灵之间发生碰撞 有趣的是,这不是第一次发生在我身上。我不知道为什么重叠方法不起作用 这是我的Hero类,它有一个名为isCollided的方法 package world_objects; import helpers.Values; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Rectangle; /*
package world_objects;
import helpers.Values;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Rectangle;
/* Created by David Lasry : 10/25/14 */
public class Hero{
public enum HeroState {
Walking_Forward,
Walking_Left,
Walking_Right,
Dead
}
public HeroState state;
private Rectangle body;
private float x,y;
public Hero() {
x = Values.SCREEN_WIDTH/5;
y = Values.SCREEN_HEIGHT/5;
body = new Rectangle(x, y, Values.Hero_Width, Values.Hero_Height);
state = HeroState.Walking_Forward;
}
public Rectangle getBody() {
return body;
}
public boolean isCollided(Rectangle rect) {
Gdx.app.log("Collision Detected", ""+body.overlaps(rect));
return rect.overlaps(body);
}
public HeroState getState() {
return state;
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public void setX(float x) {
this.x = x;
}
public void setY(float y) {
this.y = y;
}
}
如您所见,我试图通过找出返回值来调试它。每一次它都是假的,即使它本该是真的
我能做什么?有没有其他方法我可以使用
编辑:在调试了一点并试图实时计算出两个对象(英雄,对象)的值后,我想出了以下屏幕截图:。
位于完全相同位置的两个对象的值为(X/Y位于左下角):
如您所见,这些值是完全正常的。我不明白问题出在哪里。我做了一些测试,一切正常。下面是我用于测试的类别: 值保存屏幕高度/宽度和演员大小的值
public class Values {
public static final int SCREEN_HEIGHT = 240;
public static final int SCREEN_WIDTH = 400;
public static float Hero_Width = 20;
public static float Hero_Height = 30;
}
这是英雄,与您的版本类似,我刚刚删除了测试不需要的内容
public class Hero {
private Rectangle body;
private float x, y;
public Hero() {
x = Values.SCREEN_WIDTH / 5;
y = Values.SCREEN_HEIGHT / 5;
body = new Rectangle(x, y, Values.Hero_Width, Values.Hero_Height);
}
public boolean isCollided(Rectangle rect) {
Gdx.app.log("Collision Detected", "" + body.overlaps(rect));
return rect.overlaps(body);
}
}
根据我选择的价值观,***英雄*:
body = new Rectangle(80,48,20,30);
然后我用这个测试代码做了3个测试:
Hero hero = new Hero();
Rectangle rectangle = new Rectangle(10, 10, 100, 100);
// is true
boolean isCollided = hero.isCollided(rectangle);
Rectangle rectangle2 = new Rectangle(10, 10, 40, 40);
// is false
boolean isCollided2 = hero.isCollided(rectangle2);
Rectangle rectangle3 = new Rectangle(50, 30, 40, 20);
// is true
boolean isCollided3 = hero.isCollided(rectangle3);
我假设传递给isCollide方法的值不正确。正如其他注释所建议的,尝试调试调用该方法时给出的矩形值。不知何故,英雄对象或测试矩形与您预期的不一样
如果这不能解决你的问题,考虑在你的原始帖子中张贴更多的描述/代码。
< P>这个问题很可能是——正如Angel Angel在评论中建议的——当你创建你的英雄时,他有他的X,Y位置值。英雄的身体(长方形)也有自己的x,y值。当他移动时,您可能只是更新英雄的x,y值,而不是身体的x,y值,反之亦然。如果使用调试器查看这些值,您将确切地看到发生了什么。我的猜测是,你看到了错误的值,并且做出了一些错误的假设,认为该方法不起作用。我向您保证,重叠方法非常简单,而且确实有效。如果您不知道如何使用调试器,这是学习的最佳时机。随着你继续开发你的游戏,它将在未来多次获得回报。除非您喜欢编写数千个System.out调用来查找您遇到的每一个小错误,否则请立即学习使用调试器!如果您知道如何使用调试器,这个错误可以在几分钟内修复,而无需在堆栈溢出中写入问题。您应该使用调试器。在那里放一个断点,当两个矩形应该重叠时,检查它们的值。这个方法很有效。@David Lasry看这个例子,我刚看了矩形的坐标,它们很好!这些值是正确的,但仍然不起作用…@David Lasry如果你的演员移动了,你必须重新计算矩形的位置。我也尝试过这样做(创建两个矩形并检查它们是否重叠),结果成功了。这种方法奏效了。在另一次检查之后,我发现块(其他矩形,而不是英雄)很好。它们是“可碰撞的”,这意味着它们不是问题所在。问题出在我的英雄身上,但我无法指出确切的问题。非常感谢!矩形的位置未更新。现在是学习如何使用调试器的时候了:)Hero hero = new Hero();
Rectangle rectangle = new Rectangle(10, 10, 100, 100);
// is true
boolean isCollided = hero.isCollided(rectangle);
Rectangle rectangle2 = new Rectangle(10, 10, 40, 40);
// is false
boolean isCollided2 = hero.isCollided(rectangle2);
Rectangle rectangle3 = new Rectangle(50, 30, 40, 20);
// is true
boolean isCollided3 = hero.isCollided(rectangle3);