Libgdx翻译很奇怪

时间:2015-09-14 20:43:03

标签: java libgdx

在我写的游戏中,我需要一个巨大的世界。所以我把它分成12x12块(1个单位)。

要渲染一个块,我想使用本地坐标:对于每个我想要0的块; 0位于块的左下角。

enter image description here

在绿色世界坐标系中,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个块的测试图,但我得到了相同的结果:

enter image description here

为了提供有关实体的getComponent()方法的更多细节,我的实体类扩展了具有地图的ComponentProvider,Component>我添加了一个存储2个浮点数x和y的PositionComponent。所以我没有发布代码,因为它的工作原理

PS:黑色部分的右边是x = 0。

1 个答案:

答案 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);
    }
}

这是一个临时解决方案,但它确实有效。