Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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
矩形重叠法libgdx_Libgdx_Collision Detection_Collision_Overlap_Rectangles - Fatal编程技术网

矩形重叠法libgdx

矩形重叠法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; /*

我尝试使用重叠方法来确定两个精灵是否碰撞,但由于某种原因,它根本不起作用。它总是返回false,即使我清楚地看到精灵之间发生碰撞

有趣的是,这不是第一次发生在我身上。我不知道为什么重叠方法不起作用

这是我的Hero类,它有一个名为isCollided的方法

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