Recherche…


Créer des corps Box2D à partir d'une carte en mosaïque

Les objets créés dans une carte en mosaïque (.tmx) peuvent être simplement chargés en tant que corps dans un monde Box2D en utilisant la classe Libgdx MapObject comme suit:

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

Les fonctions suivantes aident à mapper les coordonnées de l'objet en mosaïque à la forme 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;
}

Et cette fonction permet de mapper le centre d'un objet en mosaïque à la forme rectangle de Libgdx.

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

Ainsi, la première fonction peut être utilisée comme suit:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow