在我写的游戏中,我需要一个巨大的世界。所以我把它分成12x12块(1个单位)。
要渲染一个块,我想使用本地坐标:对于每个我想要0的块; 0位于块的左下角。
在绿色世界坐标系中,1; 1是1块,块相同,只有原点在变化。
所以为了做到这一点,我在SpriteBatch中使用了一个转换矩阵,它有一个chunk_x * chunk大小和chunk_y * chunk大小的转换。但它对于块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();
}
我的实体块中的渲染方法:
@Override
public void render(SpriteBatch batch) {
batch.draw(texture, get(PositionComponent.class).getX(), get(PositionComponent.class).getY(), 1f, 1f);
}
这是从(-1; 0)到(0; 1)的4个块的测试图,但我得到了相同的结果:
为了提供有关实体的getComponent()方法的更多细节,我的实体类扩展了具有地图的ComponentProvider,Component>我添加了一个存储2个浮点数x和y的PositionComponent。所以我没有发布代码,因为它的工作原理
PS:黑色部分的右边是x = 0。
答案 0 :(得分: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);
}
}
这是一个临时解决方案,但它确实有效。