38 Stimmen

Wie kann man einen Teil dieses Bildes in Java extrahieren?

Ich habe dieses Sprite Sheet:

Pacman sprites

Wie kann ich diese Bilddatei lesen und einen Teil davon extrahieren, um ihn als Sprite ?

1 Stimmen

Dies könnte eine gute Lösung sein für gamedev.stackexchange.com .

54voto

coobird Punkte 155882

Wenn der Sprites-Bereich in eine BufferedImage die getSubimage Methode kann verwendet werden, um ein Teilbild des Sprite Sheets zu erhalten.

El getSubimage Methode nimmt die x , y und die width y height des gewünschten Teilbildes, so dass das gewünschte Sprite erhalten werden kann. Da die meisten Sprites die gleiche Größe zu haben scheinen, würde ich denken, dass die meisten von ihnen durch eine verschachtelte for Schleife, um das große Bild zu durchlaufen.

Wenn das Sprite-Bild zum Beispiel mit der Methode ImageIO Klasse (wie zum Beispiel die read Methode), und jedes Sprite ist 10 Pixel mal 10 Pixel groß, wobei es 5 Zeilen mal 5 Spalten von Sprites gibt, können die Sprites wie folgt erhalten werden:

BufferedImage bigImg = ImageIO.read(new File("sheet.png"));
// The above line throws an checked IOException which must be caught.

final int width = 10;
final int height = 10;
final int rows = 5;
final int cols = 5;
BufferedImage[] sprites = new BufferedImage[rows * cols];

for (int i = 0; i < rows; i++)
{
    for (int j = 0; j < cols; j++)
    {
        sprites[(i * cols) + j] = bigImg.getSubimage(
            j * width,
            i * height,
            width,
            height
        );
    }
}

Der Haken an der Sache ist natürlich, dass der obige Code nur dann funktioniert, wenn alle Sprites die gleiche Größe haben, also müssen einige Anpassungen vorgenommen werden, damit er für das gegebene Sprite Sheet funktioniert. (Da die obere rechte Ecke scheint in der Größe von den anderen unterschiedlich sein.)

0 Stimmen

Entschuldigung, ich habe versehentlich auf die Schaltfläche "Antworten" gedrückt. Ich werde der Antwort mehr hinzufügen.

1 Stimmen

Sieht aus wie i y j Indizes sollten in der getSubImage() aufrufen

0 Stimmen

@guido Danke für den Hinweis auf den Fehler! Der Code wurde korrigiert.

13voto

Bill the Lizard Punkte 384619

Wenn Sie nur die Sprites zeichnen wollen, hat die Java-Klasse Graphics eine drawImage Methode, die einen bestimmten Bereich des Bildes für Sie herauszieht. Sie müssen nur das Quellbild angeben, wo Sie das Sprite auf Ihrem Grafikobjekt zeichnen wollen (x, y, Breite, Höhe) und in welchem Rahmen des Bildes sich das Sprite befindet (x, y, Breite, Höhe).

Unter der Annahme, dass die Breite und die Höhe des Sprites die gleiche Breite und Höhe haben, die Sie auf der Zeichenfläche zeichnen wollen, könnten Sie Ihre eigene Methode zum Zeichnen eines Sprite-Rahmens wie folgt definieren

void drawSpriteFrame(Image source, Graphics2D g2d, int x, int y,
                     int columns, int frame, int width, int height)
{
    int frameX = (frame % columns) * width;
    int frameY = (frame / columns) * height;
    g2d.drawImage(source, x, y, x+width, y+height,
                  frameX, frameY, frameX+width, frameY+height, this);
}

columns ist die Anzahl der Spalten in Ihrem Sprite Sheet. Die ersten beiden Zeilen der Methode berechnen die x- und y-Position des Sprite-Rahmens in Ihrem Blatt.

Die großen Sprites in deinem Blatt erfordern eine besondere Behandlung. Du könntest sie mit Kacheln zeichnen (also würdest du in diesem Fall vier Sprites für jedes der großen Bilder zeichnen), oder du könntest manuell herausfinden, welche x, y, Breite und Höhe du für diese Sprites verwenden willst.

Wenn Ihr Sprite-Sheet ein normales Sheet wäre (alle Sprites sind gleich groß) und es in einem 5 x 15-Muster angeordnet wäre, wie Ihres, würden Sie das 20. Frame mit dem folgenden Methodenaufruf zeichnen

Toolkit tk = Toolkit.getDefaultToolkit();    
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);

Hier stehen x und y für die Position, an der das Sprite auf dem Grafikobjekt gezeichnet werden soll, 15 für die Anzahl der Spalten in der Sprite-Sheet, 19 für den Frame (die Nummerierung beginnt bei 0) und 25 für die Breite und Höhe jedes Sprites (ich habe es geschätzt).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X