0

Libgdxを使用して最新のBox2dテストベッドをテストしています。彼らは機能していないようで、他の誰かが同じ問題を抱えているかどうかを知る必要があります。最初のものはコンベヤーベルトと呼ばれ、https://github.com/ansman/box2d/blob/master/Testbed/Tests/ConveyorBelt.h

私が変換したもの:

package com.badlogic.gdx.tests.box2d;

import com.badlogic.gdx.InputProcessor;
import com.badlogic.gdx.Input.Keys;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.joints.FrictionJointDef;
import com.badlogic.gdx.physics.box2d.Box2DDebugRenderer;
import com.badlogic.gdx.physics.box2d.Contact;
import com.badlogic.gdx.physics.box2d.EdgeShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.Manifold;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.Transform;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.tests.utils.GdxTest;


public class ConveyorBelt extends Box2DTest {
    Body m_body;    
    Fixture platform;

@Override
protected void createWorld (World world) {
    world.setGravity(new Vector2(0, -10));
    /** amount of bounce when colliding */
    float k_restitution = 0.4f;
    Body ground;

    {       /** x,y of entire shapes */
        BodyDef bd = new BodyDef();
        bd.position.set(0, 20);
        ground = world.createBody(bd);         

     PolygonShape shape = new PolygonShape();
     shape.setAsEdge(new Vector2(-20.0f, 0.0f), new Vector2(20.0f, 0.0f));
     ground.createFixture(shape, 0.0f);

     shape.dispose();
 }

          // Platform
          {
                    BodyDef bd = new BodyDef();
                  bd.position.set(-5.0f, 5.0f);
                  Body body = world.createBody(bd);

                  PolygonShape shape = new PolygonShape();
                  shape.setAsBox(10.0f, 0.5f);

                  FixtureDef fd = new FixtureDef();
                  fd.shape = shape;
                  fd.friction = 0.8f;
                  platform = body.createFixture(fd);
          }

          // Boxes
          for (int i = 0; i < 5; ++i)
          {
                    BodyDef bd = new BodyDef();
                  bd.type = BodyType.DynamicBody;
                  bd.position.set(-10.0f + 2.0f * i, 7.0f);
                  Body body = world.createBody(bd);

                  PolygonShape shape = new PolygonShape();
                  shape.setAsBox(0.5f, 0.5f);
                  body.createFixture(shape, 20.0f);
          }
  }

 /*      void PreSolve(Contact contact, Manifold oldManifold)
  {
          Test extends PreSolve(contact, oldManifold);

          Fixture fixtureA = contact.getFixtureA();
          Fixture fixtureB = contact.getFixtureB();

          if (fixtureA == platform)
          {
                  contact.setTangentSpeed(5.0f);
          }

          if (fixtureB == platform)
          {
                  contact.setTangentSpeed(-5.0f);
          }
  }

  void Step(Settings settings)
  {
          Test extends Step(settings);
  }

  static Test Create()
  {
          return new ConveyorBelt;
  }

  Fixture platform;*/


}

これは他のBox2Dテストと組み合わせることで機能していますが、いくつか気づきました。

LibgdxのContact.javaクラスにsetTangentSpeedメソッドがありません

設定では、org.jbox2d.commonインポートを使用する必要があります

テストをタイプに解決できません

また、Breakable、https://github.com/ansman/box2d/blob/master/Testbed/Tests/Breakable.hを使用してみました

に変換されました

package com.badlogic.gdx.tests.box2d;

import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.CircleShape;
import com.badlogic.gdx.physics.box2d.Contact;
import com.badlogic.gdx.physics.box2d.ContactImpulse;
import com.badlogic.gdx.physics.box2d.EdgeShape;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.World;
import com.badlogic.gdx.physics.box2d.joints.RevoluteJointDef;
import com.badlogic.gdx.backends.gwt.*;

public class Breakable extends Box2DTest {

        Body body1;
        Vector2 m_velocity;
        float m_angularVelocity;
        PolygonShape m_shape1;
        PolygonShape m_shape2;
        Fixture m_piece1;
        Fixture m_piece2;

        boolean m_broke;
        boolean m_break;

        /**
         * @see org.jbox2d.testbed.framework.TestbedTest#initTest()
         */
        @Override
    protected void createWorld (World world) {
    world.setGravity(new Vector2(0, -10));
    Body ground;
            // Ground body
                {
                        BodyDef bd = new BodyDef();
                        ground = world.createBody(bd);

                        PolygonShape shape = new PolygonShape();
                        shape.setAsEdge(new Vector2(-40.0f, 0.0f), new Vector2(40.0f, 0.0f));
                        ground.createFixture(shape, 0.0f);

                        shape.dispose();
                }

                // Breakable dynamic body
                {
                        BodyDef bd = new BodyDef();
                        bd.type = BodyType.DynamicBody;
                        bd.position.set(0.0f, 40.0f);
                        bd.angle = 0.25f * MathUtils.PI;
                        body1 = world.createBody(bd);

                        m_shape1 = new PolygonShape();
                        m_shape1.setAsBox(0.5f, 0.5f, new Vector2(-0.5f, 0.0f), 0.0f);
                        m_piece1 = body1.createFixture(m_shape1, 1.0f);

                        m_shape2 = new PolygonShape();
                        m_shape2.setAsBox(0.5f, 0.5f, new Vector2(0.5f, 0.0f), 0.0f);
                        m_piece2 = body1.createFixture(m_shape2, 1.0f);
                }

                m_break = false;
                m_broke = false;
        }


                void PostSolve(Contact contact, ContactImpulse impulse)
                {
                        if (m_broke)
                        {
                                // The body already broke.
                                return;
                        }

                        // Should the body break?
                        int count = contact.getManifold().pointCount;

                        float maxImpulse = 0.0f;
                        for (int i = 0; i < count; ++i)
                        {
                                maxImpulse = MathUtils.max(maxImpulse, impulse.normalImpulses[i]);
                        }

                        if (maxImpulse > 40.0f)
                        {
                                // Flag the body for breaking.
                                m_break = true;
                        }
                }

                void Break()
                {
                        // Create two bodies from one.
                        Body body1 = m_piece1.getBody();
                        Vector2 center = body1.getWorldCenter();

                        body1.destroyFixture(m_piece2);
                        m_piece2 = null;

                        BodyDef bd = new BodyDef();
                        bd.position = body1.getPosition();
                        bd.angle = body1.getAngle();

                        Body body2 = world.createBody(bd);
                        m_piece2 = body2.createFixture(m_shape2, 1.0f);
                }

}
                        // Compute consistent velocities for new bodies based on
                        // cached velocity.
                        Vector2 center1 = body1.getWorldCenter();
                        Vector2 center2 = body2.getWorldCenter();

                        Vector2 velocity1 = m_velocity.add(Vector2.crs(m_angularVelocity, center1.sub(center)));
                        Vector2 velocity2 = m_velocity.add(Vector2.crs(m_angularVelocity, center2.sub(center)));

                        body1.setAngularVelocity(m_angularVelocity);
                        body1.setLinearVelocity(velocity1);

                        body2.setAngularVelocity(m_angularVelocity);
                        body2.setLinearVelocity(velocity2);
                }

                void Step(Settings settings)
                {
                        if (m_break)
                        {
                                Break();
                                m_broke = true;
                                m_break = false;
                        }

                        // Cache velocities to improve movement on breakage.
                        if (m_broke == false)
                        {
                                m_velocity = body1.getLinearVelocity();
                                m_angularVelocity = body1.getAngularVelocity();
                        }

                        Test = Step(settings);
                }

                static Test Create()
                {
                        return new Breakable;
                }

                Body m_body1;

        }

私は気づきました:

LibgdxにはManifold.javaにpointCountがありません。簡単な修正の1つは、getWorldManifoldに変更することでしたが、うまくいきませんでした

Vector2.javaには、m_velocityのVectorsでは許可されないcrs(float x、Vector2 v)が含まれていません。

com.jbox2d.common importを使用しない限り、設定は存在しません

これらのメソッドが含まれていない場合、これらをLibgdxで機能させるにはどうすればよいですか?Libgdxはもう更新されていませんか?これらを使いたいのですが、移植が遅れているようです。Contact.javaで、setTangentSpeedのコードの直前で彼が停止したことに気づきました。テストにgwtjarを追加しましたが、メリットはありません。

4

1 に答える 1

0

jbox2d の 2.2.1 バージョンが必要な場合は、トランクからビルドを取得できます。リリースの準備がほぼ整いました。もう少し最適化とインライン化を行う必要があります。

編集: libgdx は、Box2D のネイティブ C++ 実装に対して独自のラッパーを使用しているようです。これはパフォーマンスの面で間違いなく望ましいことです。うまくいけば、ライブラリが更新されることを願っています。

于 2013-03-07T18:00:43.893 に答える