2015-09-14 105 views
1

在我寫作的遊戲中,我需要一個巨大的世界。所以我把它分成12x12塊(1個單元)。Libgdx翻譯怪異

渲染一個塊我想要使用本地座標:對於每個塊我想要0; 0在塊的左下角。

enter image description here

在綠色世界座標系統,其中,1; 1爲1塊,對於相同塊中,僅原點正在改變。

所以爲此,我在我的SpriteBatch中使用了一個轉換矩陣,它具有chunk_x *塊大小和chunk_y *塊大小的轉換。但是對於塊y = -1它的表現很奇怪。

這裏是世界上渲染代碼:

public void render() { 
    batch.setProjectionMatrix(camera.combined); 
    renderer.setProjectionMatrix(camera.combined); 
    Matrix4 matrix4 = new Matrix4(); 
    for(Chunk chunk : Collections.unmodifiableCollection(loadedChunks.values())) { 
     matrix4.setToTranslation(chunk.getX() * Chunk.SIZE, chunk.getY() * Chunk.SIZE, 0); 
     batch.setTransformMatrix(matrix4); 
     renderer.setTransformMatrix(matrix4); 
     chunk.render(batch, renderer); 
    } 
} 

我在一個單獨的方法更新相機。這裏的塊渲染代碼:

public void render(SpriteBatch batch, ShapeRenderer renderer) { 
    batch.begin(); 
    for(EntityBlock block : blockLayer0) { 
     block.render(batch); 
    } 
    for(EntityBlock block : blockLayer1) { 
     block.render(batch); 
    } 
    batch.end(); 
    renderer.begin(ShapeRenderer.ShapeType.Line); 
     renderer.setColor(Color.WHITE); 
     renderer.rect(0, 0, SIZE /* SIZE is constants and = 12 */, SIZE); 
    renderer.end(); 
} 

Render方法在我的實體塊:

@Override 
public void render(SpriteBatch batch) { 
    batch.draw(texture, get(PositionComponent.class).getX(), get(PositionComponent.class).getY(), 1f, 1f); 
} 

這裏是從第4塊的測試圖(-1; 0)至(0,1),但我得到了相同的結果:

enter image description here

提供有關實體的getComponent更多詳細資料()方法,我的實體類擴展ComponentProvider有一個地圖,組件>,我給它添加一個頗似存儲2個浮點數x和y的tionComponent。所以,我沒有職位的代碼,因爲它的工作原理

PS:在黑色部分的右側是X = 0

+0

你在哪裏調用'batch.begin()'和'batch.end()'?我真的不明白是什麼導致你的問題。這可能是你如何設置你沒有顯示的EntityBlock陣列。順便說一下,白色網格僅用於調試?因爲它打破了你的配料。 – Tenfour04

+0

是的,我錯過了添加一些代碼和網格用於調試,我會稍後更新 – Zetsyog

+0

我會簡化代碼,以完成你認爲你現在正在做的事情,只需要四個手動步驟爲塊(0,0), (-1,0),(0,-1),( - 1,-1)並查看問題是否存在。我們也看不到get(PositionComponent.class).getX()在做什麼,而這似乎是不可或缺的。 – DHa

回答

0

所以一些實驗後,我去了這樣的結論:負翻譯不工作,我想,並且塊被移位了太多(只有在spritebatch,shaperenderer正常工作的情況下)。所以我寫的錯位,以及與此代碼它工作(在World.render()):

public void render() { 
    Matrix4 matrix4 = new Matrix4(); 
    for(Chunk chunk : loadedChunks) { 
     matrix4.setToTranslation((chunk.getX() * Chunk.SIZE) < 0 ? chunk.getX() * Chunk.SIZE + Chunk.SIZE - 1 : chunk.getX() * Chunk.SIZE, chunk.getY() * Chunk.SIZE, 0); 
     batch.setTransformMatrix(matrix4); 
     matrix4.setToTranslation(chunk.getX() * Chunk.SIZE, chunk.getY() * Chunk.SIZE, 0); 
     renderer.setTransformMatrix(matrix4); 
     chunk.render(batch, renderer); 
    } 
} 

這是一個臨時的解決方案,但它的工作原理。