6

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

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

4

3 回答 3

7

如果您使用的是TextureRegion,则可以像这样使用TiledDrawable

TiledDrawable tile = new TiledDrawable(textureRegion);
tile.draw(spriteBatcher, x, y, width, height);
于 2014-03-04T13:42:15.160 回答
4

您可以在纹理上使用“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);

会给你这个: 在此处输入图像描述

您可以在下面看到使用舞台和图像 Actor (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();
    }
}
于 2015-10-04T13:52:07.360 回答
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。纹理包裹)

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

于 2012-12-03T01:11:55.300 回答