LibGDX、box3d java 游戏中个体 objects(传感器)的碰撞检测

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

我目前正在 LibGDX 开发 Endless Runner。 我有 4 个传感器(upper-far、upper-close、lower-far、lower-close,稍后用于机器学习)。我需要检测每个传感器与称为 Enemy 的 object 之间的碰撞。现在它检测到 object 类型的传感器和 Enemy 之间的碰撞,这是正确的,但我不知道 哪个 传感器实际上被触发了。 这是负责碰撞检测的代码(在 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();
    }
}

身体实用程序: public class 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();
}

显然,只有当用户数据是传感器时,以上内容才有效,但你已经可以确定了。

还有一个关于这个的问题here