Ich habe dieses Sprite Sheet:
Wie kann ich diese Bilddatei lesen und einen Teil davon extrahieren, um ihn als Sprite ?
Ich habe dieses Sprite Sheet:
Wie kann ich diese Bilddatei lesen und einen Teil davon extrahieren, um ihn als Sprite ?
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.)
Entschuldigung, ich habe versehentlich auf die Schaltfläche "Antworten" gedrückt. Ich werde der Antwort mehr hinzufügen.
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 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.
1 Stimmen
Dies könnte eine gute Lösung sein für gamedev.stackexchange.com .