[英]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.