Java / LibGDX: получение пользовательских свойств объекта при столкновении box2D - PullRequest
0 голосов
/ 20 мая 2019

Я устанавливаю контрольные точки в своей игре и хочу, чтобы игрок получал цвет, который должен быть каждый раз, когда он появляется. В противном случае игрок умирает немедленно.

Я попробовал этот фрагмент кода внутри прослушивателя контактов (проверка контакта между прибором a (игроком) и прибором b (контрольная точка)):

MapObjects objects = play.getTileMap().getLayers().get("checkpoints").getObjects();

for (MapObject object : objects) {
    if (object.getProperties().containsKey("Color")) {
        int color = object.getProperties().get("Color", Integer.class);
        Gdx.app.log("Respawn color", Integer.toString(color));
        game.setRespawnColor(color); 
    }
}

Однако этот код не получает свойство «Цвет» с контрольной точки, с которой сталкивается игрок, а с последней найденной контрольной точки.

Обходным решением было бы добавить один слой контрольных точек для каждого цвета (red_checkpoint), например, но это добавило бы то, что кажется большим количеством ненужного кода.

Спасибо!

1 Ответ

2 голосов
/ 20 мая 2019

Вы можете добавить UserData к своим приборам и телам, которые вы можете прочитать, если они сталкиваются.

Когда вы создаете тела своей контрольной точки, добавьте данные пользователя в прибор и тело:

Body body = world.createBody(bodyDef);
body.setUserData(Checkpoint.COLOR_RED); //Set the Color of the Checkpoint as Body UserData

FixtureDef fixtureDef = new FixtureDef();
Fixture fixture = body.createFixture(fixtureDef);
fixture.setUserData(Type.CHECKPOINT); //Set the Type of the fixture to detect if it a Checkpoint

Контрольная точка enum может выглядеть так:

public enum Checkpoint {
    COLOR_RED(1),
    COLOR_GREEN(2);

    public final color;
    Checkpoint(int colorValue){
        color = colorValue;
    }
}

Тогда в вашем слушателе столкновений вы можете получить эти UserData:

Fixture fixA = contact.getFixtureA();
Fixture fixB = contact.getFixtureB();

Checkpoint collidedCheckpoint = null;
if(fixA.getUserData == Type.CHECKPOINT){ //Check if fixA is a Checkpoint
    collidedCheckpoint = ((Checkpoint)fixA.getBody().getUserData());
} else if(fixB.getUserData == Type.CHECKPOINT){ //Check if fixB is a Checkpoint
    collidedCheckpoint = ((Checkpoint)fixB.getBody().getUserData());
}
if(collidedCheckpoint != null){
    //Get the color of the Checkpoint by saving a int in the enum or something else
    int color = collidedCheckpoint.color; // 1
} else {
    //Not with a Checkpoint collided
}
...