Tag 19 – Pixmaps

veröffentlicht am: 19. Dezember 2012

day19Eine Pixmap speichert Bilddaten in Hauptspeicher. Diese kann man dann verändern und schließlich wieder als Textur zur weiteren Verwendung nutzen, oder in eine Dateie abspeichern.

Eine Pixmap kann man entweder erstellen, indem man die Größe mitgibt oder indem man eine existierende Datei reinläd.

Pixmap pixmap = new Pixmap( 32, 32, Format.RGBA8888 );
		
Pixmap pixmap = new Pixmap(Gdx.files.internal("graphics/test.png"));

Um auf Pixmaps zu malen, gibt es ein paar Methoden (mehr wie immer in der API 😛 ):

pixmap.setColor( 0, 1, 0, 1);
pixmap.fillCircle( 16,16,16 );
pixmap.setColor( 1, 0, 0, 1);
pixmap.drawRectangle( 5,5, 10,10);

Nachdem man die Pixmap in eine Textur umgewandelt hat, sollte man die Pixmap disposen (weil man sie wahrscheinlich nicht mehr braucht):

Texture texture = new Texture( pixmap );
pixmap.dispose();

Man kann die Pixmap allerdings auch in eine png-Datei speichern:

PixmapIO.writePNG(Gdx.files.local("cache/test.png"), pixmap);
pixmap.dispose();

Diese Pixmaps kann man nun auch super nutzen, um Screenshots zu speichern:

public static void saveScreenshot(FileHandle pFile, int pX, int pY, int pWidth, int pHeight){
    Pixmap pixmap = getScreenshot(pX, pY, pWidth, pHeight, true);
    
    PixmapIO.writePNG(pFile, pixmap);
    pixmap.dispose();
}

public static Pixmap getScreenshot(int pX, int pY, int pWidth, int pHeight, boolean pFlipY) {
    Gdx.gl.glPixelStorei(GL10.GL_PACK_ALIGNMENT, 1);
    
    Pixmap pixmap = new Pixmap(pWidth, pHeight, Format.RGBA8888);
    ByteBuffer pixels = pixmap.getPixels();
    Gdx.gl.glReadPixels(pX, pY, pWidth, pHeight, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixels);
    
    final int numBytes = pWidth * pHeight * 4;
    byte[] lines = new byte[numBytes];
    if (pFlipY) {
            final int numBytesPerLine = pWidth * 4;
            for (int i = 0; i < pHeight; i++) {
                    pixels.position((pHeight - i - 1) * numBytesPerLine);
                    pixels.get(lines, i * numBytesPerLine, numBytesPerLine);
            }
            pixels.clear();
            pixels.put(lines);
    } else {
            pixels.clear();
            pixels.get(lines);
    }
    
    return pixmap;
}

(code von http://code.google.com/p/libgdx-users/wiki/Screenshots)

test screenshot

Ich hab es endlich geschafft, Kollisionen mit der Tilemap akzeptabel hinzukriegen (für Spielfiguren, die kleiner sind als die Tiles). Morgen folgt hoffentlich das Tutorial dazu.

geposted in libgdx

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.