簡體   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