繁体   English   中英

Box3d Java游戏LibGDX中单个对象(传感器)的碰撞检测

[英]Collision detection for individual objects(sensors) in LibGDX, box3d java game

我目前正在使用LibGDX开发Endless Runner。 我有4个传感器(上方,上方,下方,下方,稍后将用于机器学习)。 我需要检测每个传感器和称为“敌人”的对象之间的碰撞。 现在,它检测到Sensor类型和Enemy类型的对象之间的冲突,这是正确的,但我不知道实际触发了哪个 Sensor。 这是负责碰撞检测的代码(在GameStage方法中):

@Override
public void beginContact(Contact contact) {

    Body a = contact.getFixtureA().getBody();
    Body b = contact.getFixtureB().getBody();

    if ((BodyUtils.bodyIsRunner(a) && BodyUtils.bodyIsEnemy(b)) ||
            (BodyUtils.bodyIsEnemy(a) && BodyUtils.bodyIsRunner(b))) {
        runner.hit();
    }else if ((BodyUtils.bodyIsEnemy(a) && BodyUtils.bodyIsSensor(b)) ||
            (BodyUtils.bodyIsSensor(a) && BodyUtils.bodyIsEnemy(b))) {

    } else if ((BodyUtils.bodyIsRunner(a) && BodyUtils.bodyIsGround(b)) ||
    (BodyUtils.bodyIsGround(a) && BodyUtils.bodyIsRunner(b))) {
        runner.landed();
    }
}

BodyUtils:公共类BodyUtils {

public static boolean bodyInBounds(Body body) {
    UserData userData = (UserData) body.getUserData();

    switch (userData.getUserDataType()) {
        case RUNNER:
        case ENEMY:
            return body.getPosition().x + userData.getWidth() / 2 > 0;
    }

    return true;
}

public static boolean bodyIsEnemy(Body body) {
    UserData userData = (UserData) body.getUserData();

    return userData != null && userData.getUserDataType() == UserDataType.ENEMY;
}

public static boolean bodyIsRunner(Body body) {
    UserData userData = (UserData) body.getUserData();

    return userData != null && userData.getUserDataType() == UserDataType.RUNNER;
}

public static boolean bodyIsGround(Body body) {
    UserData userData = (UserData) body.getUserData();

    return userData != null && userData.getUserDataType() == UserDataType.GROUND;
}

public static boolean bodyIsSensor(Body body) {
    UserData userData = (UserData) body.getUserData();
    return userData != null && userData.getUserDataType() == UserDataType.SENSOR;
}

}

这是完整的代码(box2包中有关userData的最重要部分): https : //github.com/SzymonGalazka/Machine-Learning-Runner/tree/master/core/src/com/pl/runner

实际上,您可以将对象类型作为主体的用户数据传递。 我做的是我只是通过在this (指传感器)。 然后,您可以在该传感器上运行代码,而无需获取它或任何东西。

因此,您只需要一个bodyIsX方法,例如

public static Sensor getBodyObject(Body b) {
    return (Sensor)body.getUserData();
}

显然,上述内容仅在用户数据是传感器的情况下有效,但是您已经可以确定。

有关于该另一个问题在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM