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罐子,沒有任何好處。
什麼是你的問題? Java端口沒有更新到最後一個Box2D版本,這很明顯。只有這樣才能解決這個問題 - 盡你所能,自己動手,或等待有人更新jbox2d。 – Pavel 2013-02-11 14:35:02
從我記得讀Box2D的2.1版是在2011年發佈......爲什麼用了這麼長時間?我無法自己做這件事,但我確實詢問過創作者,他從未回信,所以我猜他也不知道 – nemofiendr 2013-03-05 19:18:56