视口和像素精灵 - libgdx

时间:2015-05-05 18:43:09

标签: android libgdx viewport pixel

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

我正在测试视口但是我没有按照我想要的那样工作。我想做的就是让我的精灵在每部手机上看起来都很棒。唯一看起来像我想要的视口是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);

}

2 个答案:

答案 0 :(得分:1)

您可能希望将其声明为

,而不是以这种方式声明相机
    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

答案 1 :(得分:1)

FillViewport是唯一可以裁剪世界视图的一部分视口(相机看到的内容),因此将相机置于世界视图中,就像你所做的那样,并不一定将0,0放在屏幕的左下角。

我想你可能想要ExtendViewport。

我无法想象FillViewport值得麻烦的情况,因为你总会在某些设备上对你的某些游戏进行裁剪。但是如果必须的话,你可以通过这样的方式调整裁剪到底角0,0:

    int startHour = 14;
    int startMinute = 12;
    int finishHour = 17;
    int finishMinute = 0;
    LocalTime start = new LocalTime(startHour, startMinute, 0, 0);
    LocalTime finish = new LocalTime(finishHour, finishMinute, 0, 0);
    Period period = Period.fieldDifference(start, finish);
    // PT3H-12M , generally equivalent to 2h48m

    DateTime newStartTime = DateTime.parse("2015-05-06T22:48:00+01:00");
    assertThat(newStartTime.plus(period), equalTo(DateTime.parse("2015-05-07T01:36:00+01:00")));

正如您所看到的,FillViewport使用起来非常麻烦。

顺便说一下,无需在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); 方法中应用视口或更新相机,因为无论如何都要在show中进行操作。