虽然我真的很喜欢LibGDX Box2d魔法,但在我的第一个项目中调整一切是很痛苦的。
我现在面临的问题是,即使我的sprite和DebugRenderer对齐,但当我触摸屏幕(在Nexus 5上测试)时,我得到了错误的坐标。
第一个例子——蓝点是触摸点
在这张图中,我触摸的是形状外部,但我得到的坐标实际上在形状内部,因此测试点返回true:
TOUCH 126.25 253.0
ORIGIN 103.0 190.0
TIP 167.0 254.0
TEST true
第二个例子-蓝点是接触点
在这张图像中,我触摸到了形状内部,但我得到的坐标实际上在形状外部,因此测试点返回false。
TOUCH 134.25 189.7
ORIGIN 103.0 190.0
TIP 167.0 254.0
TEST false
相关代码非常简单:
// width and height of my Nexus 5 in portrait mode are 1080 x 1776
public static final float VIRTUAL_WIDTH = 270.0f;
public static final float VIRTUAL_HEIGHT = 444.0f;
创建游戏:
public void create() {
camera = new OrthographicCamera();
camera.setToOrtho(false, VIRTUAL_WIDTH, VIRTUAL_HEIGHT);
camera.update();
world = new World(new Vector2(0, 0), true);
box = new Box(world, camera);
ground = new Ground(world);
leftWall = new Wall(world, Wall.LEFT);
rightWall = new Wall(world, Wall.RIGHT);
touchDebugger = new TouchDebugger();
stage = new Stage();
stage.setCamera(camera);
stage.getSpriteBatch().setProjectionMatrix(camera.combined);
stage.addActor(box);
stage.addActor(ground);
stage.addActor(leftWall);
stage.addActor(rightWall);
stage.addActor(touchDebugger);
stage.addListener(box);
stage.addListener(touchDebugger);
Gdx.input.setInputProcessor(stage);
debugRenderer = new Box2DDebugRenderer(true, true, true, true, true, true);
}
渲染代码:
public void render() {
// Update the camera.
camera.update();
camera.apply(Gdx.gl10); // Don't know about that, just found over the internet
// Clear LibGDX OpenGL context.
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
// Physics world step.
world.step(1/45f, 6, 6);
// Scene2d rendering.
stage.act(Gdx.graphics.getDeltaTime());
stage.draw();
// Physics debugging.
debugRenderer.render(world, camera.combined);
}
我的方块接地:
public void touchDown(float x, float y) {
Vector2 touch = new Vector2(x, y);
Vector3 cam = new Vector3(Gdx.input.getX(), Gdx.input.getY(), 0);
camera.unproject(cam);
boolean test = fixture.testPoint(touch.x, touch.y);
Log.d("demo", "GDX " + Gdx.input.getX() + "\t" + Gdx.input.getY());
Log.d("demo", "CAM " + cam.x + "\t" + cam.y);
Log.d("demo", "TOUCH " + touch.x + "\t" + touch.y);
Log.d("demo", "ORIGIN " + (body.getPosition().x - width/2.0f) + "\t" + (body.getPosition().y - height/2.0f));
Log.d("demo", "TIP " + (body.getPosition().x + width/2.0f) + "\t" + (body.getPosition().y + height/2.0f));
Log.d("demo", "TEST " + test);
}
试过那个摄像机。这是一些不现实的东西,但它给了我与触地得分的参数相同的值。
还实现了handle方法:
public boolean handle(Event event) {
String e = event.toString();
if (e == "touchDown") {
InputEvent ie = (InputEvent) event;
touchDown(ie.getStageX(), ie.getStageY());
} else if ( e == "touchUp") {
InputEvent ie = (InputEvent) event;
touchUp(ie.getStageX(), ie.getStageY());
}
return true;
}
(为了调试这个,我从box2d和世界坐标中删除了每个转换,然后在这个演示中使用1px=1m(我显然不是真的这样做!))
OBS:不精确也发生在X轴上。
我假设你想要接触点的世界坐标?
如果是这样,则取消投影错误的向量,应使用:
Vector3 touch = new Vector3(x, y, 0);
camera.unproject(touch);
这会将屏幕坐标转换为世界坐标。然后获取转换后的坐标:
touch.x, touch.y
问题内容: 我刚刚开始使用libgdx创建游戏。它是使用scene2d ui的自上而下的2d射击游戏。现在我想,我可以在某些程度上增加黑暗和光明,但是我不想使用box2d重写所有内容。我不需要逼真的阴影,只需某种环境光和围绕我角色的光圈即可,不受周围墙壁和其他障碍物的影响。所以我想知道libgdx中是否有任何照明系统?或者我可以不使用box2d物体/世界而使用box2dlights吗?谢谢 问题答
我想把它集成到libgdx中。Liquidfun看起来不错,但我听说它给可移植性带来了问题,而且不能很好地与桌面应用程序配合使用。根据我的理解,libgdx中的粒子效应并不遵循粒子所涉及的物理,所以我认为我也不应该走那条路。
正如你从图像中看到的那样,身体与实际的精灵不同,我有一种预感,它可能是起源,因为它的区别很小,但我似乎不知道如何把它排成一行。 我的创建方法 我的渲染方法
我正在使用ContactListener测试box 2D中两个物体之间的碰撞 这是我在世界上使用的所有contactListener类。设置ContactListener(new Box2DWorld(this))以添加它 我的dedub是这样的 beginContact preSolve postSolve。preSolve postSolve beginContact preSolve END
我有一个非常简单的使用Box2d的LibGDX游戏。现在,它只是一艘在地图上移动的船。如果我使用方法来改变船的位置,我可以通过键盘控制让船移动,但这显然没有利用Box2d的功能。我想使用方法来控制玩家船,但由于某种原因,无论我设置的力有多高或多低,该方法都不做任何事情。我还尝试了和,两者都有相同的效果:什么都没有。我通过测井证实,我的船的速度实际上保持在恒定的0.0,而不仅仅是微小的变化。 以下是
我就开门见山了。所以我在做这个游戏,你应该用你的咒语杀死其他物体。我创造了子弹和它们的身体。我们都很好。它正在工作。但我想让它看起来特别和“神奇”,所以我决定使用粒子。我制作了粒子,把它们放在子弹体后面,用下面的代码: 但当我发射多发子弹时,问题是粒子刚刚从我发射的所有第一发子弹中消失,并且只出现在最后一发子弹上。有人能给我介绍一下这个吗? -----------------编辑---------