2012-12-01 128 views
5

我正在使用LibGDX作为一个项目,并且我试图在特定的空间上平铺/重复纹理。目前,我正在使用TextureRegion设置为适当的尺寸,并且正如您在OpenGL中使用“Clamp To Edge”所预期的那样填充纹理的任何额外空间。我认为有一种简单的方法可以将这种行为改变为“重复”模式,但是我似乎无法找到一种方法来实现这一目标,尽管它看起来像是应该很容易改变的东西。LibGDX重复纹理区域

所以,基本上,有没有一种简单的方法来使用LibGDX在一个设定的区域重复图像,短缺必须通过以某种形式的循环自己重复纹理手动构建它?

回答

1

我还没有尝试过这个,但是当我尝试排除其他问题时,我在google上发现了这篇文章。在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)

这不是一个纹理区域,虽然,而在本身的质感......

+0

我发现,要求在此之前,但是我有麻烦的事情与作为并列于“TextureRegion”“纹理”的工作。现在我已经通过稍微修改LibGDX本身的类来解决这个问题,这当然不是很理想,但它确实有效。 – Shamrock

+0

@Shammock你可以在这里发布你如何完成它?你改变了什么? – Mars

6

如果您使用的是TextureRegion ,你可以使用一个TiledDrawable像这样:

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

这很好用:P – martindilling

+0

完美的作品,加上它可以用于纹理地图集和精灵。 –

+1

只适用于像素而不适用于世界坐标。如果宽度和高度位于世界中,API将会更好,通过SetProjectionMatrix协调批处理 – RichieHH

3

你可以使用你的纹理“SetWrap”,并创建基于纹理TextureRegion。 重要提示:我花了一段时间才弄明白,但要镜像,您的纹理必须是两种尺寸的力量。它在Android上工作,但不在iOS上,您不会收到消息 - 显示为黑色。因此,它必须是4x4或8x8,16×16 256×256 ... 512×512或.. 创建一个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(); 
    } 
}