如何将DebugDraw与纯JBox2D一起使用?

时间:2012-07-14 00:51:49

标签: java jbox2d

好的,这是我的代码(这只是使用DebugDraw的测试):

package test;
import org.jbox2d.callbacks.*;
import org.jbox2d.collision.shapes.*;
import org.jbox2d.common.*;
import org.jbox2d.dynamics.*;

public class Main {
private static DebugDraw debugDraw;

public static DebugDraw getDebugDraw() {
    return debugDraw;
}
public static void main(String[] args) {
    Vec2  gravity = new Vec2(0,-10);
boolean doSleep = true;
World world = new World(gravity,doSleep);
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.position.set(0, -10);
Body groundBody = world.createBody(groundBodyDef);
PolygonShape groundBox = new PolygonShape();
groundBox.setAsBox(50,10);
groundBody.createFixture(groundBox, 0);

// Dynamic Body
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyType.DYNAMIC;
bodyDef.position.set(0, 4);
Body body = world.createBody(bodyDef);
PolygonShape dynamicBox = new PolygonShape();
dynamicBox.setAsBox(1, 1);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = dynamicBox;
fixtureDef.density=1;
fixtureDef.friction=0.3f;
body.createFixture(fixtureDef);

// Setup world
float timeStep = 1.0f/60.0f;
int velocityIterations = 6;
int positionIterations = 2;

// Run loop
for (int i = 0; i < 60; ++i)
{
    world.step(timeStep, velocityIterations, positionIterations);
    Vec2 position = body.getPosition();
    float angle = body.getAngle();
    debugDraw.setFlags(debugDraw.e_shapeBit);
    world.setDebugDraw(debugDraw);
    System.out.println(i+": X: "+position.x+" Y: "+position.y+" ANGLE: "+angle);
}

}
}

当我运行此代码时,我得到:

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" java.lang.NullPointerException
at test.Main.main(Main.java:49)
Java Result: 1

有谁知道造成这种情况的原因以及我应该做些什么? 我试过谷歌搜索,但我找到的只是Slick2D,我不想植入一个完整的库来测试一个简单的测试应用程序。

3 个答案:

答案 0 :(得分:0)

我遇到了与jbox2d相同的问题。它依赖于slf4j。解决它的最简单方法是在jbox2d根目录中进行maven clean安装。然后,您将在.m2目录中找到slf4j库(它本身应位于您的主目录中)。

然后,您需要将slf4j库添加到项目构建路径中,并将其jar文件与目标项目一起导出。

这就是理论。实际上,slf4j本身对log4j有一个依赖,而maven没有解析它。所以最后我在jbox2d中注释掉了所有的日志引用,并做了另一个maven clean install。这解决了我的问题。

答案 1 :(得分:0)

仅供参考,slf4j依赖项已在最新版本中删除,太多人遇到了麻烦。

空指针异常看起来像是在做一些不太正确的事情。也许您应该进行DebugDraw实现?否则它将为null。

如果你想玩,最好只做一个Testbed测试。关注维基here

答案 2 :(得分:0)

&#34; debugDraw&#34;是null导致&#34; debugDraw.setFlags(debugDraw.e_shapeBit)&#34;与NPE失败。

创建一个扩展DebugDraw的类并将其分配给静态变量。您需要使用您正在使用的任何图形库来实现自我绘制回调,例如摇摆。但对于初学者,你也可以写出日志声明。

另外,你应该移动&#34; debugDraw.setFlags(debugDraw.e_shapeBit)&#34;和&#34; world.setDebugDraw(debugDraw)&#34;在游戏循环之前的陈述,而是放一个&#34; world.drawDebugData()&#34;在世界步骤之后的游戏环节中的陈述。