Обнаружение столкновений для отдельных объектов (датчиков) в Java-игре LibGDX, box3d - PullRequest
0 голосов
/ 14 мая 2018

Я сейчас занимаюсь разработкой Endless Runner в LibGDX. У меня есть 4 датчика (верхний-дальний, верхний-закрытый, нижний-дальний, нижний-близкий, позже будет использоваться для машинного обучения). Мне нужно обнаружить столкновения между каждым датчиком и объектом, называемым врагом. Прямо сейчас он обнаруживает столкновения между объектом типа Sensor и 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();
    }
}

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;
}

}

и вот весь код (самая важная часть о userData в пакете box2): https://github.com/SzymonGalazka/Machine-Learning-Runner/tree/master/core/src/com/pl/runner

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете фактически передать тип объекта как пользовательские данные тела. То, что я делаю, я просто передаю this (имеется в виду датчик). Затем вы можете запустить код на этом датчике без необходимости извлекать его или что-либо еще.

Таким образом, вам нужен только один метод bodyIsX, например

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

Очевидно, что вышесказанное сработает только в том случае, если пользовательские данные будут датчиком, но вы уже можете это определить.

Есть еще один вопрос относительно этого здесь .

...