我使用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
当我输入并使用它时,不会发生任何碰撞检测。我必须在游戏中的许多事情中检测到碰撞,所以我需要解决方案来摆脱这个问题。请帮忙。提前谢谢。
答案 0 :(得分:1)
我强烈建议您重新检查代码并确定您是否需要许多不同的类别。即使您有许多不同类型的对象,我怀疑您可以将具有相同碰撞过滤器的对象组合在一起,然后您可以使用其他方法来识别碰撞中涉及哪种“类型”实体。
如果你真的需要使用那么多不同的对象,那么Box2d World
类有一个方法setContactFilter(ContactFilter filter)
,它允许你指定一个自定义的ContactFilter。这包含shouldCollide(Fixture a, Fixture b)
,如果a
和b
发生碰撞,则会返回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;
}
并且不要忘记在开关中的每个案例之后的休息;)
我希望这可以帮助你