超出短值以检测LIBGDX中的冲突

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超出短值以检测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; ...}
答案

categoryBitsmaskBits主要用于box2d,以说明哪个夹具与哪个夹具碰撞。

因此当你的一个fixtures与所有或没有fixture碰撞时,你不需要category-或maskBits

如果夹具与所有其他夹具碰撞,则不需要category-或maskBits。 如果夹具与其他夹具碰撞,您可以设置isSensor = true;而不是使用category-和maskBits

如果你知道哪个物体与另一个物体相撞,你可以使用UserData的灯具。

为您拥有的所有类型创建枚举:

public enum Type {
    NOTHING,
    GROUND,
    FRAN,
    FRAN_BODY_SENSOR,
    ENEMY_FRONT,
    BRICK,
    etc...
}

然后通过创建夹具,您可以将Type设置为UserData:

Fixture fixture = body.createFixture(fixtureDef);
fixture.setUserData(Type.GROUND);
//short:
body.createFixture(fixtureDef).setUserData(Type.GROUND);

最后在你的ContactListener中,你可以检查夹具的UserData,找出哪个物体与哪个物体碰撞:

if(fixA.getUserData() == Type.FRAN_HEAD && fixB.getUserData() == Type.BRICK){
            //FRAN_HEAD and BRICK has collided
}

以上是关于超出短值以检测LIBGDX中的冲突的主要内容,如果未能解决你的问题,请参考以下文章

在 LIBGDX 中初始化时碰撞位达到最大值

检测超出数组访问冲突

如何使用模块化代码片段中的LeakCanary检测内存泄漏?

活动结果片段索引超出范围:0x20001

使用 Pygments 检测代码片段的编程语言

如何在(libgdx)阶段检测对图像透明区域的触摸?