2017-08-15 79 views
1

我試圖尋找解決這個問題的所有,並沒有運氣;儘管我已經嘗試了各種建議,我將在下面與該問題一起詳細說明。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提供的與您的計算機功耗相關的增量。 –

回答

1

這是你的渲染功能應該是什麼樣子

@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更完整。