【发布时间】:2018-01-22 22:31:19
【问题描述】:
我已经尝试过到处寻找这个问题的解决方案,但没有运气;尽管我尝试了各种建议,但我将在下面详细说明问题。
我创建了一个非常小且简单的示例项目来测试渲染平铺地图并设置具有视口和一些简单输入处理的相机,以便我可以使用 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,这取决于您的计算机能力。
标签: camera libgdx textures rendering tiled