2013-02-11 83 views
0

LIBGDX最新測試平臺我使用Libgdx測試最新的Box2D的試驗平臺。看起來他們沒有工作,需要知道是否有其他人有相同的問題。第一個被稱爲輸送帶,https://github.com/ansman/box2d/blob/master/Testbed/Tests/ConveyorBelt.h的Box2D的

我轉換爲:

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進口

測試不能被解析爲一個類型

我使用易碎,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; 

     } 
也嘗試210

我注意到:

Libgdx在Manifold.java中沒有pointCount。一個快速的解決是改變以getWorldManifold卻沒有任何好處

Vector2.java不包含CRS(浮法X,Vector2 V)其中向量m_velocity不會允許

設置沒有按「T存在,除非我用的是進口com.jbox2d.common

如何讓這些在Libgdx工作,如果不包括這些方法? Libgdx是否不再更新?我想使用這些,但似乎他們在移植後面。我甚至在Contact.java中注意到他在setTangentSpeed的代碼之前停下來了。我在我的測試中添加了gwt罐子,沒有任何好處。

+0

什麼是你的問題? Java端口沒有更新到最後一個Box2D版本,這很明顯。只有這樣才能解決這個問題 - 盡你所能,自己動手,或等待有人更新jbox2d。 – Pavel 2013-02-11 14:35:02

+0

從我記得讀Box2D的2.1版是在2011年發佈......爲什麼用了這麼長時間?我無法自己做這件事,但我確實詢問過創作者,他從未回信,所以我猜他也不知道 – nemofiendr 2013-03-05 19:18:56

回答

0

如果你想在2.2.1版本jbox2d的,你可以抓住從trunk構建。它幾乎已經準備好發佈,我只需要做更多的優化和內聯。

編輯:它看起來像libgdx使用它自己的包裝到本地C++實現的Box2D的。這絕對是更好的性能方面,希望他們會更新他們的圖書館。