コード例 #1
0
  /**
   * 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);
    }
  }