LibGDX重复TextureRegion

时间:2012-12-01 22:15:08

标签: opengl-es textures libgdx repeat

我正在使用LibGDX进行项目,我正在尝试在特定数量的空间内平铺/重复纹理。目前我使用的TextureRegion设置为适当的大小,并且正如您在OpenGL中使用“Clamp To Edge”所期望的那样填充纹理的任何额外空间。我认为有一种简单的方法可以将这种行为改为“重复”模式,但是我似乎无法找到一种方法来完成这项工作,尽管看起来它应该很容易改变。

所以,基本上,有一种简单的方法可以使用LibGDX在设定区域内重复图像,而不必通过在某种形式的循环中重复纹理来手动构建它吗?

3 个答案:

答案 0 :(得分:6)

如果您使用TextureRegion,则可以使用TiledDrawable,如下所示:

TiledDrawable tile = new TiledDrawable(textureRegion);
tile.draw(spriteBatcher, x, y, width, height);

答案 1 :(得分:3)

您可以使用" SetWrap"在纹理上并基于该纹理创建TextureRegion。 重要事项:我花了一段时间来弄明白,但要进行镜像,你的纹理必须是两个尺寸的力量。它在Android上运行但在iOS上没有,你没有收到消息 - 它显示为黑色。所以它必须是4x4或8x8,16x16 .. 256x256或512x512 .. 创建3x3镜像图像(或axb大小)

Texture imgTexture = new Texture(Gdx.files.internal("badlogic.jpg"));
imgTexture.setWrap(Texture.TextureWrap.MirroredRepeat, Texture.TextureWrap.MirroredRepeat);
TextureRegion imgTextureRegion = new TextureRegion(imgTexture);
imgTextureRegion.setRegion(0,0,imgTexture.getWidth()*3,imgTexture.getHeight()*3);

会给你这个: enter image description here

下面您可以看到使用舞台和图像演员(Scene2D)生成该图片的示例代码

public class GameScreen implements Screen {

    MyGdxGame game;
    private Stage stage;

    public GameScreen(MyGdxGame aGame){
        stage = new Stage(new ScreenViewport());
        game = aGame;
        Texture imgTexture = new Texture(Gdx.files.internal("badlogic.jpg"));
        imgTexture.setWrap(Texture.TextureWrap.MirroredRepeat, Texture.TextureWrap.MirroredRepeat);
        TextureRegion imgTextureRegion = new TextureRegion(imgTexture);
        imgTextureRegion.setRegion(0,0,imgTexture.getWidth()*3,imgTexture.getHeight()*3);

        TextureRegionDrawable imgTextureRegionDrawable = new TextureRegionDrawable(imgTextureRegion);
        Image img = new Image();
        img.setDrawable(imgTextureRegionDrawable);
        img.setSize(imgTexture.getWidth()*3,imgTexture.getHeight()*3);
        stage.addActor(img);
    }

    @Override
    public void show() {

    }

    @Override
    public void render(float delta) {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
        stage.act(delta);
        stage.draw();
    }

    @Override
    public void resize(int width, int height) {
        stage.getViewport().update(width, height, true);
    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public void hide() {

    }

    @Override
    public void dispose() {
        stage.dispose();
    }
}

答案 2 :(得分:1)

我自己没有试过这个,但是在尝试解决另一个问题时我在谷歌上发现了这个帖子。在LIBGDX api中,我发现了这种方法,也许它有帮助吗?

http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/Texture.html#setWrap(com.badlogic.gdx.graphics.Texture.TextureWrap,com.badlogic.gdx.graphics.Texture.TextureWrap)

这不是纹理区域,而是纹理本身......