我已经尝试在各处寻找解决此问题的方法,但没有任何进展;虽然我已经尝试了一些建议,下面我将详细介绍这些建议以及问题所在。
我创建了一个非常小而简单的示例项目,用于测试呈现Tiled地图并设置具有视口和一些简单输入处理的相机,以便我可以使用WASD“漫游”地图。问题是,当我尝试在地图周围移动时,会出现奇怪的地图效果。其中包括:
- 瓦片“波动”。我的意思是当我向上/向下滚动或横穿屏幕时,屏幕会显得“波浪状” - 故障/卡顿屏幕。有时摄像头不会平滑运行。 - 瓦片更改(例如,在移动摄像头时,黄色瓷砖上的黑色条纹会在侧面或上方有一个像素的不同颜色黄色。这些“额外”的像素在哪一侧取决于摄像机的移动方向)。我认为这称为纹理出血,但我不确定。
我尝试的事情:
- 在所有侧面上用相同颜色的像素填充所有瓷砖(这可以消除地图上的黑色水平线) - 将过滤器设置为线性/最近(尝试了所有组合) - 调整视口 - 更改相机速度
有没有人有任何想法,出了什么问题?在继续之前,我只是想确保我了解如何正确渲染地图并移动相机,而不会出现任何问题。
精准的代码:
我创建了一个非常小而简单的示例项目,用于测试呈现Tiled地图并设置具有视口和一些简单输入处理的相机,以便我可以使用WASD“漫游”地图。问题是,当我尝试在地图周围移动时,会出现奇怪的地图效果。其中包括:
- 瓦片“波动”。我的意思是当我向上/向下滚动或横穿屏幕时,屏幕会显得“波浪状” - 故障/卡顿屏幕。有时摄像头不会平滑运行。 - 瓦片更改(例如,在移动摄像头时,黄色瓷砖上的黑色条纹会在侧面或上方有一个像素的不同颜色黄色。这些“额外”的像素在哪一侧取决于摄像机的移动方向)。我认为这称为纹理出血,但我不确定。
我尝试的事情:
- 在所有侧面上用相同颜色的像素填充所有瓷砖(这可以消除地图上的黑色水平线) - 将过滤器设置为线性/最近(尝试了所有组合) - 调整视口 - 更改相机速度
有没有人有任何想法,出了什么问题?在继续之前,我只是想确保我了解如何正确渲染地图并移动相机,而不会出现任何问题。
精准的代码:
public class GameScreen implements Screen {
final Alpha game;
private OrthographicCamera camera;
private FitViewport viewport;
private TiledMap map;
private OrthogonalTiledMapRenderer renderer;
private Rectangle player;
public GameScreen(final Alpha game) {
this.game = game;
camera = new OrthographicCamera();
viewport = new FitViewport(800, 480, camera);
TmxMapLoader.Parameters params = new TmxMapLoader.Parameters();
params.textureMinFilter = Texture.TextureFilter.Nearest;
params.textureMagFilter = Texture.TextureFilter.Linear;
map = new TmxMapLoader().load("simple_padded_same_color.tmx");
renderer = new OrthogonalTiledMapRenderer(map);
player = new Rectangle(32,32,32,32);
}
@Override
public void render(float delta) {
camera.update();
Gdx.gl.glClearColor(0, 0, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
// handle input
if (Gdx.input.isKeyPressed(Input.Keys.A)) {
player.setX(player.getX() - 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.D)) {
player.setX(player.getX() + 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.W)) {
player.setY(player.getY() + 200 * delta);
}
if (Gdx.input.isKeyPressed(Input.Keys.S)) {
player.setY(player.getY() - 200 * delta);
}
camera.position.set(player.getX(), player.getY(), 0);
renderer.setView(camera);
renderer.render();
}
@Override
public void resize(int width, int height) {
viewport.update(width, height);
}
@Override
public void show() {
}
@Override
public void hide() {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
@Override
public void dispose() {
map.dispose();
renderer.dispose();
}
}
camera.update()
。接下来,尝试使用恒定的 delta 值,而不是依赖于计算机性能的 libgdx 提供的 delta 值。 - Alexandre GUIDET