【问题标题】:Libgdx box2d issue with dimensions and camera zoomingLibgdx box2d 尺寸和相机缩放问题
【发布时间】:2015-12-01 13:15:21
【问题描述】:

Box2D 有问题。我正在制作一个简单的 2D 游戏,玩家向敌人射击。我读到 Box2D 中的 1 个单位相当于 1 米,所以我应该使用小尺寸。我将世界尺寸设置为 160x90,但问题如下:

使用小尺寸,我不得不缩放设置为 1280x720 的相机,但正如您所见,形状质量大幅下降,而且身体的运动也不再流畅。而且即使世界步速为1/300,最高速度还是太慢了!

Vsinc 已启用,缩放设置为 0.125,您看到的正方形是每边 10 个单位。

http://imgur.com/oGYvuNv

这是相机的代码

OrthographicCamera camera = new OrthographicCamera(64,32);

这是绘制圆的类的代码

public class JoyCircle implements GraphicalComponent {
public int radius;
public Vector2 position;
ShapeRenderer renderer;
Color color;
OrthographicCamera c;

public JoyCircle(int radius,Vector2 position,OrthographicCamera c,Color color) {
    this.c = c;
    this.color = color;
    this.radius = radius;
    this.position = position;
    renderer = new ShapeRenderer();
    renderer.setProjectionMatrix(c.combined);
}

@Override
public void update() {

}

@Override
public void draw() {
    renderer.begin(ShapeType.Filled);
    renderer.setColor(color);
    renderer.circle(position.x, position.y, radius);
    renderer.end();
}

}

Here is the code of the world draw
public void draw() {
    motionJoystick.draw(); //draws 2 instances of JoyCircle
    renderer.render(world, camera.combined);
}

【问题讨论】:

  • 我想知道您的问题是否已解决,如果是,请您通过选择正确答案将您的问题转为已解决,谢谢

标签: android libgdx box2d dimensions


【解决方案1】:

不要使用 PPM,我知道您可能已经看过很多使用 PPM 的教程,而是使用虚拟像素或马铃薯像素用于相机和 box2d。在这里阅读这个精彩的article 和这个answer。例如:

OrthographicCamera camera = new OrthographicCamera(20, 11);

这里的 20 是 WIDTH 的任意数字,HEIGHT 实际上应该是 WIDTH*Gdx.graphics.getHeight()/Gdx.graphics.getWidth()。 您不需要设置任何缩放级别,保持默认即可。

【讨论】:

  • 谢谢,但我仍然不明白如何将它与 Box2D 对象联系起来,因为即使我不缩放,如果屏幕大于相机尺寸,触摸的坐标和物理游戏最糟糕..
  • 暂时忘记实际的屏幕像素大小,假设您的屏幕是由这些虚拟点组成的。现在根据这些点创建游戏逻辑,例如,如果您希望对象以线速度移动,请将其设置为 0.6f 或 1.5f(虚拟点)而不是 30 或 40(像素点)。对于屏幕触摸坐标,您可以随时使用camera.unproject() 方法获取实际屏幕坐标。
  • 例如:public void render() { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); OrthographicCamera c = new OrthographicCamera(64,32); ShapeRenderer 渲染 = 新 ShapeRenderer(); render.begin(ShapeType.Filled); render.setProjectionMatrix(c.combined);渲染.circle(5, 5, 10);渲染.end(); } 结果是这个imgur.com/8iCOq1a
  • 输出有什么问题?你说的是圆边吗?使用render.circle(5, 5, 10, 50); 方法。顺便说一句,如果你只是展示这一点,那么它就很好,否则永远不要在渲染方法上创建新对象(这现在完全是题外话)。
  • 啊哈哈,我不敢相信,问题是圆中的第 4 个参数,并且在触摸拖动的 unproject 中强制转换为 int,这使得圆的运动如此“有角度”,抱歉浪费了你的时间
【解决方案2】:

您不必使用缩放来处理此问题 这就是我所做的,对我来说效果很好

camera = new OrthographicCamera(SCREEN_WIDTH/PPM, Config.SCREEN_HEIGHT/PPM);

// fix camera to the center of the screen
camera.position.set(Config.SCREEN_WIDTH/PPM/2f, Config.SCREEN_HEIGHT/PPM/2f, 0);

camera.update();

我将转换单位 (PPM) 设为 100

希望对你有帮助

祝你好运

【讨论】:

  • 我试过了,但是用 ShapeRendered 渲染的圆圈仍然像图像一样..
  • 而且我增加的PPM单位越多,运动角度越多
  • 您是否像这样将相机投影组合到您的 debugRender 中:debugRendrer.render(world, camera.combined);您需要添加更多代码,以便我们可以看到您如何创建主体以及如何设置参数
  • 已编辑。关键是,如果我减小相机尺寸,当我将其渲染成更大的屏幕(例如桌面配置为 1280x720)时,它只会放大屏幕而失去图形和移动质量
  • 使用 PPM 是一种不好的做法,而是使用 virtual dimensions
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多