2015-09-14 80 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); 
    } 
} 

这是一个临时的解决方案,但它的工作原理。