2012-12-01 178 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(); 
    } 
}