Domanda

Ho questo foglio sprite:

 Pacman sprites

Come posso leggere questo file immagine per estrarne una parte da usare come sprite ?

È stato utile?

Soluzione

Se l'area degli sprite legge in un < code> BufferedImage , getSubimage può essere usato per ottenere una sottoimmagine del foglio sprite.

Il metodo getSubimage prenderà x , y e width e height dell'immagine secondaria desiderata, in modo da ottenere lo sprite desiderato. Poiché la maggior parte degli sprite sembra avere le stesse dimensioni, penso che la maggior parte di essi possa essere recuperata da un ciclo nidificato per per scorrere l'immagine di grandi dimensioni.

Ad esempio, se l'immagine di sprite viene caricata usando ImageIO (come la read metodo) e ogni sprite ha una dimensione di 10 pixel per 10 pixel, dove sono 5 righe per 5 colonne di sprite , gli sprite possono essere ottenuti come segue:

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
        );
    }
}

Il problema è, ovviamente, che il codice sopra funzionerà solo se tutti gli sprite hanno le stesse dimensioni, quindi sarà necessario eseguire alcune regolazioni per funzionare per il foglio sprite dato. (Poiché l'angolo in alto a destra sembra essere di dimensioni diverse dagli altri.)

Altri suggerimenti

Se vuoi solo disegnare gli sprite, la classe Graphics di Java ha un drawImage che estrae per te un'area specifica dell'immagine. Devi solo specificare l'immagine sorgente, dove vuoi disegnare lo sprite sull'oggetto Graphics (x, y, larghezza, altezza) e in quale cornice dell'immagine si trova lo sprite (x, y, larghezza, altezza) .

Supponendo che la larghezza e l'altezza dello sprite abbiano la stessa larghezza e altezza che si desidera disegnare nell'area di disegno, è possibile definire il proprio metodo per disegnare una cornice di sprite come segue

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);
}

colonne è quante colonne ci sono nel tuo foglio sprite. Le prime due righe del metodo calcolano la posizione x qualsiasi y del frame sprite nel foglio.

Quei grandi sprite nel tuo foglio richiedono una gestione speciale. Potresti disegnarli con le tessere (quindi in questo caso disegneresti quattro sprite per ciascuna delle immagini grandi), oppure potresti capire manualmente quali x, y, larghezza e altezza, usare per quegli sprite.

Se il tuo foglio sprite fosse un foglio normale (tutti gli sprite della stessa dimensione) ed era organizzato in un modello 5 x 15 come il tuo, disegneresti il ??20 ° fotogramma con il seguente metodo di chiamata

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

Qui, xey sono la posizione in cui vuoi disegnare lo sprite sull'oggetto Graphics, 15 è il numero di colonne nel tuo foglio sprite, 19 è il frame (la numerazione inizia da 0) e 25 è la larghezza e altezza di ogni sprite (ho approssimato).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top