LIBGDX

时间:2016-04-20 16:35:08

标签: libgdx collision-detection short

我使用Category_bits来检测LIBGDX中的冲突。我使用了0到16384之间的所有值。由于我们必须在初始化值时使用2的幂,我已超出限制,我无法再初始化任何位。 short_ bit的范围是0到16384,如果我使用该数字的下一个倍数,在将其类型转换为short值后,Category_bits不会检测对象之间的冲突。当我将值设置为大于16384时,对象发生碰撞时没有任何反应。

以下是我初始化值的方法,

    public static final short x = 0;
    public static final short y = 1; 
    public static final short z = 2;
    public static final short a = 4;
    public static final short b = 8;
    public static final short c = 16;
           .....
    public static final short d = 16384;
     public static final short e = (short) 32768; // exceeded the limit so type casted the number to short

当我输入并使用它时,不会发生任何碰撞检测。我必须在游戏中的许多事情中检测到碰撞,所以我需要解决方案来摆脱这个问题。请帮忙。提前谢谢。

2 个答案:

答案 0 :(得分:1)

我强烈建议您重新检查代码并确定您是否需要许多不同的类别。即使您有许多不同类型的对象,我怀疑您可以将具有相同碰撞过滤器的对象组合在一起,然后您可以使用其他方法来识别碰撞中涉及哪种“类型”实体。

如果你真的需要使用那么多不同的对象,那么Box2d World类有一个方法setContactFilter(ContactFilter filter),它允许你指定一个自定义的ContactFilter。这包含shouldCollide(Fixture a, Fixture b),如果ab发生碰撞,则会返回true,反之亦然。

答案 1 :(得分:-1)

short也适用于减号,因为它从-32768到32767,所以你也可以使用 -32678,-16384等。

我不知道如何使用联系人过滤器,但我使用UserData,这对我来说也很有用。

当你创建你的身体时,我写了这样的东西:

b2body.createFixture(fdef).setUserData("something");

在我的碰撞检测中,我使用了这样的东西:

public class WorldContactListener implements ContactListener{

    @Override
    public void beginContact(Contact contact) {
        Fixture fixA = contact.getFixtureA();
        Fixture fixB = contact.getFixtureB();

        int cdef = fixA.getFilterData().categoryBits | fixB.getFilterData().categoryBits;

switch(cdef) {

case BreedingSeason.HERO_BIT | BreedingSeason.TRAMPOLIN_BIT:
            if(fixA.getUserData() == "somethingElse" && fixB.getUserData() == "something") {
                ...
            } else if(fixB.getUserData() == "somethingElse" && fixA.getUserData() == "something") {
                ...
            }  
            break;
}

并且不要忘记在开关中的每个案例之后的休息;)

我希望这可以帮助你