Поиск…


Создание корпусов Box2D из плиточной карты

Объекты, созданные в Tiled Map (.tmx), могут быть просто загружены как тела в мир Box2D с использованием класса LibGdx MapObject следующим образом:

public void buildBuildingsBodies(TiledMap tiledMap, World world, String layer){
    MapObjects objects = tiledMap.getLayers().get(layer).getObjects();
    for (MapObject object: objects) {
        Rectangle rectangle = ((RectangleMapObject)object).getRectangle();

        //create a dynamic within the world body (also can be KinematicBody or StaticBody
        BodyDef bodyDef = new BodyDef();
        bodyDef.type = BodyDef.BodyType.DynamicBody;
        Body body = world.createBody(bodyDef);

        //create a fixture for each body from the shape
        Fixture fixture = body.createFixture(getShapeFromRectangle(rectangle),density);
        fixture.setFriction(0.1F);

        //setting the position of the body's origin. In this case with zero rotation
        body.setTransform(getTransformedCenterForRectangle(rectangle),0);
    }
}

Следующие функции помогают сопоставить координаты объекта Tiled с формой Box2D.

public static final float TILE_SIZE = 16;
//Also you can get tile width with: Float.valueOf(tiledMap.getProperties().get("tilewidth",Integer.class));

public static Shape getShapeFromRectangle(Rectangle rectangle){
    PolygonShape polygonShape = new PolygonShape();
    polygonShape.setAsBox(rectangle.width*0.5F/ TILE_SIZE,rectangle.height*0.5F/ TILE_SIZE);
    return polygonShape;
}

И эти функции помогают сопоставить центр объекта Tiled с формой прямоугольника Libgdx.

public static Vector2 getTransformedCenterForRectangle(Rectangle rectangle){
    Vector2 center = new Vector2();
    rectangle.getCenter(center);
    return center.scl(1/TILE_SIZE);
}

Таким образом, первая функция может быть использована следующим образом:

public static final float GRAVITY = 9.8F;

public void createBodies(AssetManager assetManager){
    TiledMap tiledMap = assetManager.get("tiledMap.tmx");
    //create a Box2d world will contain the physical entities (bodies)
    World world = new World(new Vector2(0,GRAVITY),true);

    String layerName = "BuildingsLayers";
    buildBuildingsBodies(tiledMap,world,layerName);
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow