运行 在 LIBGDX 中检测碰撞的短值不足
Ran out of short values to detect collision in LIBGDX
我在我的 LIBGDX 游戏中使用短值来检测碰撞,但是我放置了太多的元素以至于 运行 超出了值。我目前在 32768,它被识别为整数。我该怎么办?
这些是我的碰撞位:
public static final short NOTHING_BIT = 0;
public static final short GROUND_BIT = 1;
public static final short FRAN_BIT = 2;
public static final short BRICK_BIT = 4;
public static final short SECONDS_BIT = 8;
public static final short DESTROYED_BIT = 16;
public static final short HIDDEN_BIT = 32;
public static final short ENEMY_BIT = 64;
public static final short ENEMY_HEAD_BIT = 128;
public static final short ENEMY_FRONT_BIT = 256;
public static final short FRAN_HEAD_BIT = 512;
public static final short FRAN_BODY_SENSOR_BIT = 1024;
public static final short ENEMY_LIMIT = 2048;
public static final short WATER_BIT = 4096;
public static final short FIREBALL_BIT = 8192;
public static final short GROUND_ESCAPE = 16384;
这是检测到碰撞的代码:
@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 JungleMasters.FRAN_HEAD_BIT | JungleMasters.BRICK_BIT:
if (fixA.getFilterData().categoryBits == JungleMasters.FRAN_HEAD_BIT){
((InteractiveTIleObject)fixB.getUserData()).onHeadHit((Franfran) fixA.getUserData());
} else {
((InteractiveTIleObject) fixA.getUserData()).onHeadHit((Franfran) fixB.getUserData());
}
sound = screen.assetManager.manager.get(screen.assetManager.brickBreaking);
sound.play();
break;
case JungleMasters.FRAN_HEAD_BIT | JungleMasters.HIDDEN_BIT:
if (fixA.getFilterData().categoryBits == JungleMasters.FRAN_HEAD_BIT){
((InteractiveTIleObject)fixB.getUserData()).onHeadHit((Franfran) fixA.getUserData());
} else {
((InteractiveTIleObject) fixA.getUserData()).onHeadHit((Franfran) fixB.getUserData());
}
sound = screen.assetManager.manager.get(screen.assetManager.brickBreaking);
sound.play();
break; ...}
categoryBits
和 maskBits
主要是为了让 box2d 判断哪个 fixture 与哪个其他 fixture 发生碰撞。
因此,当您的 fixtures
之一与所有人或 none fixture
发生碰撞时,您不需要 category
- 或 maskBits
。
如果灯具与您不需要的所有其他灯具发生碰撞 category
- 或 maskBits
。
如果灯具与其他灯具的 none 发生碰撞,您可以设置 isSensor = true;
而不是使用 category
- 和 maskBits
.
如果您知道哪个对象与另一个对象发生了碰撞,您可以使用固定装置的 UserData
。
为您拥有的所有类型创建枚举:
public enum Type {
NOTHING,
GROUND,
FRAN,
FRAN_BODY_SENSOR,
ENEMY_FRONT,
BRICK,
etc...
}
然后通过创建夹具,您可以将类型设置为 UserData:
Fixture fixture = body.createFixture(fixtureDef);
fixture.setUserData(Type.GROUND);
//short:
body.createFixture(fixtureDef).setUserData(Type.GROUND);
最后,在您的 ContactListener
中,您可以检查 fixture 的 UserData 以找出哪个对象与哪个对象发生碰撞:
if(fixA.getUserData() == Type.FRAN_HEAD && fixB.getUserData() == Type.BRICK){
//FRAN_HEAD and BRICK has collided
}
我在我的 LIBGDX 游戏中使用短值来检测碰撞,但是我放置了太多的元素以至于 运行 超出了值。我目前在 32768,它被识别为整数。我该怎么办?
这些是我的碰撞位:
public static final short NOTHING_BIT = 0;
public static final short GROUND_BIT = 1;
public static final short FRAN_BIT = 2;
public static final short BRICK_BIT = 4;
public static final short SECONDS_BIT = 8;
public static final short DESTROYED_BIT = 16;
public static final short HIDDEN_BIT = 32;
public static final short ENEMY_BIT = 64;
public static final short ENEMY_HEAD_BIT = 128;
public static final short ENEMY_FRONT_BIT = 256;
public static final short FRAN_HEAD_BIT = 512;
public static final short FRAN_BODY_SENSOR_BIT = 1024;
public static final short ENEMY_LIMIT = 2048;
public static final short WATER_BIT = 4096;
public static final short FIREBALL_BIT = 8192;
public static final short GROUND_ESCAPE = 16384;
这是检测到碰撞的代码:
@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 JungleMasters.FRAN_HEAD_BIT | JungleMasters.BRICK_BIT:
if (fixA.getFilterData().categoryBits == JungleMasters.FRAN_HEAD_BIT){
((InteractiveTIleObject)fixB.getUserData()).onHeadHit((Franfran) fixA.getUserData());
} else {
((InteractiveTIleObject) fixA.getUserData()).onHeadHit((Franfran) fixB.getUserData());
}
sound = screen.assetManager.manager.get(screen.assetManager.brickBreaking);
sound.play();
break;
case JungleMasters.FRAN_HEAD_BIT | JungleMasters.HIDDEN_BIT:
if (fixA.getFilterData().categoryBits == JungleMasters.FRAN_HEAD_BIT){
((InteractiveTIleObject)fixB.getUserData()).onHeadHit((Franfran) fixA.getUserData());
} else {
((InteractiveTIleObject) fixA.getUserData()).onHeadHit((Franfran) fixB.getUserData());
}
sound = screen.assetManager.manager.get(screen.assetManager.brickBreaking);
sound.play();
break; ...}
categoryBits
和 maskBits
主要是为了让 box2d 判断哪个 fixture 与哪个其他 fixture 发生碰撞。
因此,当您的 fixtures
之一与所有人或 none fixture
发生碰撞时,您不需要 category
- 或 maskBits
。
如果灯具与您不需要的所有其他灯具发生碰撞 category
- 或 maskBits
。
如果灯具与其他灯具的 none 发生碰撞,您可以设置 isSensor = true;
而不是使用 category
- 和 maskBits
.
如果您知道哪个对象与另一个对象发生了碰撞,您可以使用固定装置的 UserData
。
为您拥有的所有类型创建枚举:
public enum Type {
NOTHING,
GROUND,
FRAN,
FRAN_BODY_SENSOR,
ENEMY_FRONT,
BRICK,
etc...
}
然后通过创建夹具,您可以将类型设置为 UserData:
Fixture fixture = body.createFixture(fixtureDef);
fixture.setUserData(Type.GROUND);
//short:
body.createFixture(fixtureDef).setUserData(Type.GROUND);
最后,在您的 ContactListener
中,您可以检查 fixture 的 UserData 以找出哪个对象与哪个对象发生碰撞:
if(fixA.getUserData() == Type.FRAN_HEAD && fixB.getUserData() == Type.BRICK){
//FRAN_HEAD and BRICK has collided
}