Java / libgdx:在Box2D Collision上获取自定义对象属性



我正在设置游戏中的检查点,并希望玩家每次重生时都能获得颜色。否则,玩家立即死亡。

我已经尝试了这件代码,在我的联系人内部(检查固定装置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(,但这会添加感觉像很多不必要的代码。

谢谢!

您可以将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

检查点枚举看起来像这样:

public enum Checkpoint {
    COLOR_RED(1),
    COLOR_GREEN(2);
    public final color;
    Checkpoint(int colorValue){
        color = colorValue;
    }
}

然后在您的碰撞听众中,您可以获取这些用户数据:

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
}

最新更新