在Libgdx Box2d World上使用Pixel Per Meter时的巨大图像

时间:2016-04-08 05:23:19

标签: java libgdx box2d

大家好,我正在尝试实施box2d世界。我读过box2d使用米。你需要将它从像素转换为米。

我试图绘制图像,但是我还要缩小图像吗?我认为绘制图像是一个糟糕的想法,图像非常庞大,无法想象如何使其与每米的box2d像素一起工作

somePrototype

with out ppm

with PPm

我应该缩小图像吗?什么是绘制图像的最佳方式

1 个答案:

答案 0 :(得分:2)

您不需要从像素转换为米。事实上你应该忘记像素。它们仅存在于您的屏幕上,您的游戏逻辑不应该对您的屏幕有任何了解。这就是相机或视口的用途,您可以指定要显示的世界数量以及显示应该是拉伸还是黑盒子等等。所以没有像素,期间。他们是邪恶的,给你错误的想法。

现在,如果你创建自己的游戏,你可以说一个单位代表1毫米,34厘米或几个光年。您告诉负责显示您的游戏的对象要显示多少这些单位。但是你使用的是Box2D,Box2D已经为你1 unit == 1m填充了单位。可能更改此设置或至少创建一个包装类,将您的单位转换为Box2D单位。

保持Box2D单元的重要性的原因如下。如果你把一块大理石放在地上,它似乎比天空中的太阳更快。但请相信我,太阳的移动速度要快得多,但由于距离太远,它似乎移动缓慢。因为Box2D是关于运动的,所以你应该保持对单位的忠诚,否则事情会开始变得奇怪。

现在让我们只使用1 unit == 1m,突然间,通过询问查看问题,一切都会变得更加简单。

  • 您希望以米为单位展示多少游戏世界?

    float width = 20; // 20 meters
    //You can calculate on your chosen width or height to maintain aspect ratio
    float height = (Gdx.graphics.getHeight() / Gdx.graphics.getWidth()) * width;        
    camera = new OrthographicCamera(width, height);
    //Now the center of the camera is on 0,0 in the game world. It's often more desired and practical to have it's bottom left corner start out on 0,0
    //All we need to do is translate it by half it's width and height since that is the offset from it's center point (and that is currently set to 0,0.
    camera.translate(camera.viewportWidth / 2, camera.viewportHeight / 2, 0);
    camera.update();
    
  • 我们的对象有多大?请记住,质量,重量和大小是完全不同的东西。

    Sprite mySprite = new Sprite(myTexture);
    //position it somewhere within the bounds of the camera, in the below case the center
    //This sprite also gets a size of 1m by 1m
    mySprite.setBounds(width / 2, height / 2, 1, 1);
    
  • 我们如何让SpriteBatch绘制到屏幕上?

    //We tell the SpriteBatch to use out camera settings to draw
    spriteBatch.setProjectionMatrix(camera.combined);
    //And draw the sprite using this SpriteBatch
    mySprite.draw(spriteBatch);
    

Box2dDebugRenderer实施的相同数量。如果您希望形状显示您需要再次使用相机中的组合矩阵来绘制它。

    box2DDebugRenderer.render(world, camera.combined);

当然,当事物四处移动时,你需要相应地更新你的精灵位置。您可以从box2d.Body对象获取此信息。但这超出了你的问题的范围。

最后告诉你出了什么问题:

camera.setToOrtho(false, V_WIDTH / PPM, V_HEIGHT / PPM);

您的相机会显示游戏世界的320/100 == 3.2f x 480/100 == 4.8f。你的精灵可能是64x64像素。您没有告诉任何大小来绘制您的精灵,所以它将假设1像素= 1单位并且您将相机设置为显示宽度为3.2f单位。我们可以而且应该将像素排除在等式之外,只要询问您希望对象的大小。然后将Sprite设置为该大小。在这里你可以看到像素的思考只会给你带来麻烦。

对于你在第3人中飞行100x20米的太空游戏,你可能希望你的相机视口非常大。但是对于你的蚂蚁是真实体型的蚂蚁游戏,你需要一个非常小的相机视口。在现实生活中考虑物理学。 Galileo Galilei发现物体以相同的速度下降,无视阻力。因此,如果那只蚂蚁会掉落一粒沙粒,它看起来就会非常快,因为你的屏幕代表的米数要少得多。

执行下落的足球look at my answer here。它创建一个box2D主体并附加图像。我将球的功能封装在Ball()类中。 (免责声明:我刚刚玩过Box2D,我不知道足球的确切身体行为,所以我并不是说这是一个正确的实施,但它确实展示了如何设置场景并且图像代表你的Box2D身体。)