矩形重叠方法libgdx

3

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

有趣的是,这不是我第一次遇到这种情况。我不知道为什么重叠方法不起作用。

这是我的英雄类,它有一个名为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;
    }
}

你看,我试图通过找出返回值是什么来调试它。每次它都是false,即使它应该是true。

我能做什么?有没有其他方法可以使用?

编辑:经过一点调试和尝试实时确定两个对象(Hero, Object)的值后,我得到了这个屏幕截图:http://i.gyazo.com/852fea520b060870a4cb5731c21fa833.png。 这两个对象在完全相同的位置上的值是( X/Y 在左下角):

**Hero X/Y: 64.5,283.40985**
**Hero WIDTH/HEIGHT: 25,50**
**Square X/Y: 76.25,0.0**
**Square WIDTH/HEIGHT: 47.5,309.13348** 

正如您所看到的,这些值是非常正常的。我不明白问题出在哪里。

1
你应该使用调试器。在那里设置断点并检查两个矩形重叠时的值。这种方法是有效的。 - Barodapride
@David Lasry 看看这个例子 http://stackoverflow.com/questions/26332199/libgdx-animation-inside-of-a-rectangle-collison-detection-rectangles/26356382#26356382 - Angel Angel
我刚刚查看了矩形的坐标,它们是正确的!数值也正确,但仍然无法工作... - David Lasry
1
@David Lasry 如果你的角色移动了,你必须重新计算矩形的位置。 - Angel Angel
2个回答

2
问题可能在于你创建英雄时,他有自己的x、y位置值。英雄的身体(一个矩形)也有它自己的x、y值。当英雄移动时,你可能只更新了英雄的x、y值,而没有更新身体的x、y值或者反过来。如果你使用调试器查看这些值,你会看到发生了什么。我猜你看错了值,并做出了一些错误的假设,认为这种方法不起作用。但我向你保证,重叠方法非常简单且有效。如果你不知道如何使用调试器,现在正是学习的最佳时机。随着你继续开发游戏,它将带来数倍的回报。除非你喜欢写成千上万个System.out调用来找到每一个小bug,否则现在就学会使用调试器吧!如果你知道如何使用调试器,这个bug可以在几分钟内修复,而无需在stackoverflow上提问。

非常感谢!矩形的位置没有更新。现在是学习如何使用调试器的时候了 :) - David Lasry

0

我进行了一些测试,一切都按预期工作。下面是我用于测试的类:

Value 保存屏幕高度/宽度和演员大小的值

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方法时传递了一些不正确的值。正如其他评论所建议的那样,尝试调试在调用该方法时给定的矩形的哪些值。某种程度上,英雄对象或测试矩形并不像你期望的那样。
如果这不能解决您的问题,请考虑在原始帖子中发布更多描述/代码。

我也尝试过类似的事情(创建两个矩形并检查它们是否重叠),而且它起作用了。这种方法是有效的。经过另一次检查,我发现块(其他矩形,而不是英雄)没问题。它们是“可碰撞”的,这意味着它们不是问题所在。问题出在我的英雄身上,但我无法确定具体问题所在。 - David Lasry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接