LibGDX拼贴:移动相机导致瓷砖结巴/模糊/波

问题描述:

我试图寻找解决这个问题的所有,并没有运气;尽管我已经尝试了各种建议,我将在下面与该问题一起详细说明。LibGDX拼贴:移动相机导致瓷砖结巴/模糊/波

我创建了一个非常小而简单的示例项目,用于测试渲染平铺地图并设置带有视口和一些简单输入处理的摄像头,以便我可以用WASD“漫游”地图。问题是,当我试图在地图周围漫游时,我会在地图上看到奇怪的效果。这些包括:

  • 瓷砖“挥舞着”。通过这个我的意思是当我向上/向下滚动或在屏幕上会出现“波浪”
  • Glitchy/Stuttering屏幕。相机有时不会显得平滑。
  • 瓷砖的变化,(例如,黄色瓷砖上的黑色条在移动相机时,侧面或顶部会有一个不同颜色的黄色像素,这些“额外”像素的哪一侧取决于哪一个方向相机移动)。我认为这叫做纹理出血,但我不确定。

这个事情我已经尝试:

  • 垫都具有相同的颜色的像素的瓷砖在各方面(这摆脱了对地图的黑色水平线)
  • 设置过滤器,以线性/最近的(尝试了所有组合)
  • 玩弄视
  • 相机
  • 变化速度

有没有人有任何想法可能会出错?在继续之前,我只是不想确定如何正确渲染地图并正确移动相机,而无任何问题。

确切的代码:

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(); 
} 
} 
+0

首先,您应该在设置新位置后调用'camera.update()'。接下来,尝试使用一个常量增量,而不是由libgdx提供的与您的计算机功耗相关的增量。 –

这是你的渲染功能应该是什么样子

@Override 
public void render(float delta) { 

    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    // force a constant delta 
    float gameDelta = 0.1f; 

    // handle input 
    if (Gdx.input.isKeyPressed(Input.Keys.A)) { 
     player.setX(player.getX() - 200 * gameDelta); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.D)) { 
     player.setX(player.getX() + 200 * gameDelta); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.W)) { 
     player.setY(player.getY() + 200 * gameDelta); 
    } 
    if (Gdx.input.isKeyPressed(Input.Keys.S)) { 
     player.setY(player.getY() - 200 * gameDelta); 
    } 

    // set camera position first 
    camera.position.set(player.getX(), player.getY(), 0); 
    // update camera 
    camera.update(); 

    // then set the view 
    renderer.setView(camera); 
    // last render 
    renderer.render(); 
} 

首先,你需要设置新的位置后,更新你的相机。然后,尝试使用恒定的增量,而不是实际的增量,这将导致奇怪的相机移动,因为libgdx增量表示两帧之间的时间量并且不是恒定的。这应该会消除游戏中的波浪效果。

要了解您的增量问题,我建议你阅读这篇文章http://gameprogrammingpatterns.com/game-loop.html

理想情况下,你会使用实体系统框架和具体PhysicSystemMotionSystem来计算您的播放器的移动,并从渲染循环分离球员位置计算。

Libgdx自带Ashley,你也可以看看Artemis-odb,这也是一个很棒的项目,比我看来Ashley更完整。