视口和像素精灵 - 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
中完成的。
我是 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
中完成的。