Я сейчас занимаюсь разработкой 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