视口和像素精灵 - libgdx

Viewports and pixel sprites - libgdx

我是 libgdx 的新手,我遇到了一个大问题。 我正在开发一款使用像素精灵的游戏,它们在我的 phone 中看起来不错,但如果我在另一个 phone 中测试游戏,精灵看起来非常拉伸和糟糕。

我正在测试视口,但我没有让它按我想要的方式工作。我想做的是让我的精灵在每部手机上看起来都不错 phone。唯一看起来像我想要的那样工作的视口是 FillViewport,但是当我使用这个视口时,我无法将相机移动到左下角位置,当我在 0,0 位置绘制精灵时,它们出现在屏幕中间。另外,我也会使用带有像素瓦片的瓦片地图,我遇到了同样的问题......我已经花了几天时间在这方面工作,但我认为是时候寻求帮助了,因为我无法让它工作我自己

有什么帮助或提示吗?

这是我的实际代码

@Override
public void show () {
    batch = new SpriteBatch();
    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();

    camera = new OrthographicCamera();
    viewport = new FillViewport(320,480,camera);
    viewport.apply();
    camera.position.set(camera.viewportWidth/2,camera.viewportHeight/2,0);

    tiledMap = new TmxMapLoader().load("TESTMAP.tmx");
    tiledMapRenderer = new OrthogonalTiledMapRenderer(tiledMap);

    img = new Texture("badlogic.jpg");
}

@Override
public void render(float delta) {
   // Gdx.gl.glClearColor(193 / 255f, 208 / 255f, 160 / 255f, 1);
    Gdx.gl.glClearColor(1,1,1, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

    camera.update();

    tiledMapRenderer.setView(camera);
    tiledMapRenderer.render();

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    batch.draw(img,0, 0);
    //batch.draw(pad, player.x, -40);
    batch.end();

}

@Override
public void resize(int width, int height) {
    viewport.update(width,height);
    camera.position.set(camera.viewportWidth/2, camera.viewportHeight/2, 0);

}

与其以这种方式声明相机,不如这样声明

    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();
    cam = new OrthographicCamera(30, 30 * (h / w));
    cam.position.set(cam.viewportWidth / 2f, cam.viewportHeight / 2f, 0);
    cam.update();

这不会拉伸您的图像,您还可以实现相机移动

阅读更多here

FillViewport 是唯一裁剪部分世界视图(相机所见)的视口,因此像您所做的那样将相机置于世界视图的中心并不一定将 0,0 放在屏幕的左下角。

我认为您可能需要 ExtendViewport。

我想不出 FillViewport 值得麻烦的情况,因为您总是会在某些设备上被裁剪掉一些游戏。但如果必须,您可以通过执行以下操作调整裁剪以获得底角的 0,0:

camera.position.set(
    viewport.getWorldWidth()/2 + (float)viewport.getScreenX()/(float)viewport.getScreenWidth()*viewport.getWorldWidth(),
    viewport.getWorldHeight()/2 + (float)viewport.getScreenY()/(float)viewport.getScreenHeight()*viewport.getWorldHeight(),
    0);

如您所见,FillViewport 使用起来很麻烦。

顺便说一句,无需在 show 方法中应用视口或更新相机,因为无论如何您都是在 resize 中完成的。