/** * Creates and applies the fixtures defined in the editor. The name parameter is used to retrieve * the right fixture from the loaded file. <br> * <br> * The body reference point (the red cross in the tool) is by default located at the bottom left * corner of the image. This reference point will be put right over the BodyDef position point. * Therefore, you should place this reference point carefully to let you place your body in your * world easily with its BodyDef.position point. Note that to draw an image at the position of * your body, you will need to know this reference point (see {@link #getOrigin(java.lang.String, * float)}. <br> * <br> * Also, saved shapes are normalized. As shown in the tool, the width of the image is considered * to be always 1 meter. Thus, you need to provide a scale factor so the polygons get resized * according to your needs (not every body is 1 meter large in your game, I guess). * * @param body The Box2d body you want to attach the fixture to. * @param name The name of the fixture you want to load. * @param def The fixture parameters to apply to the created body fixture. * @param scale The desired scale of the body. The default width is 1. */ public void attachFixture(Body body, String name, FixtureDef def, float scale) { RigidBodyModel rbModel = this.MODEL.RIGIDBODIES.get(name); if (rbModel == null) throw new RuntimeException("Name '" + name + "' was not found."); Vector2 origin = this.VEC.set(rbModel.ORIGIN).scl(scale); for (int i = 0, n = rbModel.POLYGONS.size(); i < n; i++) { PolygonModel polygon = rbModel.POLYGONS.get(i); Vector2[] vertices = polygon.buffer; for (int j = 0, n2 = vertices.length; j < n2; j++) { vertices[j] = newVec().set(polygon.VERTICES.get(j)).scl(scale); vertices[j].sub(origin); } this.POLYGONSHAPE.set(vertices); def.shape = this.POLYGONSHAPE; body.createFixture(def); for (int j = 0, n2 = vertices.length; j < n2; j++) { free(vertices[j]); } } for (int i = 0, n = rbModel.CIRCLES.size(); i < n; i++) { CircleModel circle = rbModel.CIRCLES.get(i); Vector2 center = newVec().set(circle.CENTER).scl(scale); float radius = circle.radius * scale; this.CIRCLESHAPE.setPosition(center); this.CIRCLESHAPE.setRadius(radius); def.shape = this.CIRCLESHAPE; body.createFixture(def); free(center); } }