2012-12-01 13 views
5

Sto utilizzando LibGDX per un progetto e sto cercando di affiancare/ripetere una trama su una quantità specifica di spazio. Al momento sto usando un set di TextureRegion alle dimensioni corrette, e qualsiasi spazio extra fuori dalla trama viene riempito come ci si aspetterebbe in OpenGL usando "Clamp To Edge". Ho pensato che ci sarebbe stato un modo semplice per cambiare questo comportamento alla modalità "Ripeti", tuttavia non riesco a trovare un modo per farlo funzionare, nonostante sembri qualcosa che dovrebbe essere abbastanza facile da cambiare.LibGDX che ripete TextureRegion

Quindi, in pratica, esiste un modo semplice per ripetere un'immagine in un'area impostata utilizzando LibGDX, a meno di doverlo costruire manualmente ripetendo la trama da solo in una qualche forma di loop?

risposta

1

Non l'ho provato da solo, ma ho trovato questo post su google durante il tentativo di risolvere un altro problema. Nell'API LIBGDX ho trovato questo metodo, forse potrebbe essere d'aiuto?

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)

Questo non è per una regione tessitura, però, piuttosto la trama stessa ...

+0

ho scoperto che prima di chiedere, ma ho avuto difficoltà a raggiungere le cose che lavorano con "Texture" come apposto a "TextureRegion". Per ora ho risolto questo problema modificando leggermente le classi di LibGDX, il che non è certamente l'ideale, ma fa il trucco. – Shamrock

+0

@Shamrock puoi postare qui come hai fatto? cosa hai cambiato? – Mars

6

Se stai usando un TextureRegion , è possibile utilizzare un TiledDrawable in questo modo:

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

Funziona alla grande: P – martindilling

+0

Funziona perfettamente, in più può essere utilizzato con Texture Atlas e Sprites. –

+1

Funziona solo in pixel e non coordinate del mondo. L'API sarebbe meglio se la larghezza e l'altezza fossero le coordinate del mondo in cui il lotto si trova tramite SetProjectionMatrix – RichieHH

3

È possibile utilizzare "SetWrap" sulla consistenza e creare un TextureRegion sulla base di tale struttura. Importante: Mi ci è voluto un po 'per capirlo, ma per essere specchiato, la tua texture deve essere una potenza di due dimensioni. Stava lavorando su Android ma non su iOS e non ricevi un messaggio - è stato mostrato nero. Quindi deve essere 4x4 o 8x8, 16x16 .. 256x256 o 512x512 .. Creare un 3x3 mirroring immagine (o dimensioni 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); 

vi darà questa: enter image description here

Qui sotto potete vedere il codice di esempio che ha generato quella foto con un palco e immagine Attore (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(); 
    } 
} 
Problemi correlati