LibGDX Box2D:无法让 Fixture 渲染
LibGDX Box2D: Cannot get Fixture to render
我最近一直在尝试回到 LibGDX 的 Box2D 版本,我回顾了几个月前创建的演示,我的代码看起来不错,而且从我的 Google 搜索结果,我的代码很好,但对于我来说,我无法让 Fixture
呈现。
这是我的(极简主义示例)代码,对于我来说,我无法让它工作 注意:我围绕 LibGDX Game
构建了一个包装器class,应该是不言自明的:
public class TestBox2D extends EGGame {
int width;
int height;
static final Vector2 ZERO_GRAVITY = new Vector2(0f, 0f);
OrthographicCamera camera;
World world;
Body body;
Box2DDebugRenderer box2dDebugRenderer;
RayHandler rayHandler;
... // Removed Constructor, nothing special here.
@Override
protected void init() {
width = Gdx.graphics.getWidth() / 2;
height = Gdx.graphics.getHeight() / 2;
camera = new OrthographicCamera(width, height);
camera.position.set(width / 2, height / 2, 0);
camera.update();
world = new World(ZERO_GRAVITY, true);
box2dDebugRenderer = new Box2DDebugRenderer();
rayHandler = new RayHandler(world);
rayHandler.setCombinedMatrix(camera.combined);
// creating Body
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.StaticBody;
bodyDef.position.set(width/2, height/2);
body = world.createBody(bodyDef);
CircleShape shape = new CircleShape();
shape.setRadius(1f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
body.createFixture(fixtureDef);
}
@Override
protected void updateGame() {
world.step(1f / 30f, 6, 2);
rayHandler.update();
}
@Override
protected void renderGame() {
box2dDebugRenderer.render(world, camera.combined);
rayHandler.render();
}
@Override
public void dispose() {
world.dispose();
}
... // Removed main method, nothing special here.
}
请注意 world.getBodyCount();
和 world.getFixtureCount();
都是 return 1
。
问题的可能原因。
检查您是否在 RayHandler
class 或 Box2DDebugRenderer
class.[=13= 中调用了 render
]
您还没有设置圆形的位置。它可能位于边缘并保持在相机范围之外。
检查你的单位。圆的半径可能小到看不见,也可能大到覆盖整个屏幕。
希望对您有所帮助。
您可以尝试以下方法,其中一个提到 Tanmay Patil,它会调整大小 body:
示例:
变量 Class:
long time = 0;
float testSize = 0;
调用渲染方法:
time += System.nanoTime();
if (time >= 100000000){
time = 0;
testSize += (0.1f);
body.getFixtureList().first().getShape().setRadius(testSize);
}
如果没有发现任何变化,请尝试相反的方法:
time += System.nanoTime();
if (time >= 100000000){
time = 0;
testSize -= (0.1f);
body.getFixtureList().first().getShape().setRadius(testSize);
}
编辑:
另一方面,这不影响问题,但如果需要,可以在此处调用dispose:
.////////////
CircleShape shape = new CircleShape();
shape.setRadius(1f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
body.createFixture(fixtureDef);
shape.dispose();
}
已修复。
问题是我试图在 Box2DDebugRenderer.render(...)
之后调用 RayHandler#render()
而 RayHandler
没有任何 Light
对象(添加 PointLight
允许它呈现),但无论是什么原因,它都很奇怪,但首先调用 RayHandler#render()
允许它工作。这可能是 LibGDX
中的错误,我将报告。
我最近一直在尝试回到 LibGDX 的 Box2D 版本,我回顾了几个月前创建的演示,我的代码看起来不错,而且从我的 Google 搜索结果,我的代码很好,但对于我来说,我无法让 Fixture
呈现。
这是我的(极简主义示例)代码,对于我来说,我无法让它工作 注意:我围绕 LibGDX Game
构建了一个包装器class,应该是不言自明的:
public class TestBox2D extends EGGame {
int width;
int height;
static final Vector2 ZERO_GRAVITY = new Vector2(0f, 0f);
OrthographicCamera camera;
World world;
Body body;
Box2DDebugRenderer box2dDebugRenderer;
RayHandler rayHandler;
... // Removed Constructor, nothing special here.
@Override
protected void init() {
width = Gdx.graphics.getWidth() / 2;
height = Gdx.graphics.getHeight() / 2;
camera = new OrthographicCamera(width, height);
camera.position.set(width / 2, height / 2, 0);
camera.update();
world = new World(ZERO_GRAVITY, true);
box2dDebugRenderer = new Box2DDebugRenderer();
rayHandler = new RayHandler(world);
rayHandler.setCombinedMatrix(camera.combined);
// creating Body
BodyDef bodyDef = new BodyDef();
bodyDef.type = BodyDef.BodyType.StaticBody;
bodyDef.position.set(width/2, height/2);
body = world.createBody(bodyDef);
CircleShape shape = new CircleShape();
shape.setRadius(1f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
body.createFixture(fixtureDef);
}
@Override
protected void updateGame() {
world.step(1f / 30f, 6, 2);
rayHandler.update();
}
@Override
protected void renderGame() {
box2dDebugRenderer.render(world, camera.combined);
rayHandler.render();
}
@Override
public void dispose() {
world.dispose();
}
... // Removed main method, nothing special here.
}
请注意 world.getBodyCount();
和 world.getFixtureCount();
都是 return 1
。
问题的可能原因。
检查您是否在
RayHandler
class 或Box2DDebugRenderer
class.[=13= 中调用了render
]您还没有设置圆形的位置。它可能位于边缘并保持在相机范围之外。
检查你的单位。圆的半径可能小到看不见,也可能大到覆盖整个屏幕。
希望对您有所帮助。
您可以尝试以下方法,其中一个提到 Tanmay Patil,它会调整大小 body:
示例:
变量 Class:
long time = 0;
float testSize = 0;
调用渲染方法:
time += System.nanoTime();
if (time >= 100000000){
time = 0;
testSize += (0.1f);
body.getFixtureList().first().getShape().setRadius(testSize);
}
如果没有发现任何变化,请尝试相反的方法:
time += System.nanoTime();
if (time >= 100000000){
time = 0;
testSize -= (0.1f);
body.getFixtureList().first().getShape().setRadius(testSize);
}
编辑:
另一方面,这不影响问题,但如果需要,可以在此处调用dispose:
.////////////
CircleShape shape = new CircleShape();
shape.setRadius(1f);
FixtureDef fixtureDef = new FixtureDef();
fixtureDef.shape = shape;
body.createFixture(fixtureDef);
shape.dispose();
}
已修复。
问题是我试图在 Box2DDebugRenderer.render(...)
之后调用 RayHandler#render()
而 RayHandler
没有任何 Light
对象(添加 PointLight
允许它呈现),但无论是什么原因,它都很奇怪,但首先调用 RayHandler#render()
允许它工作。这可能是 LibGDX
中的错误,我将报告。