2009-03-07 9 views

Respuesta

46

Si el área de los sprites lee en BufferedImage, se puede usar el método getSubimage para obtener una subimagen de la hoja de sprites.

El método getSubimage tomará la x, y, y la width y height de la subimagen deseada, por lo que el sprite deseado puede ser obtenido. Como la mayoría de los sprites parecen tener el mismo tamaño, creo que la mayoría de ellos se pueden recuperar mediante un bucle for anidado para recorrer la imagen grande.

Por ejemplo, si la imagen de sprite se carga utilizando la clase ImageIO (tal como el método read), y cada sprite es de 10 píxeles por 10 píxeles de tamaño, donde se encuentran 5 filas por 5 columnas de sprites, los sprites pueden obtenerse por la siguiente:

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

la captura es, por supuesto, el código anterior sólo funcionará si todos los sprites son del mismo tamaño, por lo que tendrá que haber algún ajuste realizado con el fin de trabajar por la hoja de sprites dada (Como la esquina superior derecha parece ser diferente en tamaño a la de los demás.)

+0

algún código por favor? –

+0

Lo siento, presioné por error el botón de responder por correo. Añadiré más a la respuesta. – coobird

+1

parece que los índices * i * y * j * deben intercambiarse en la llamada * getSubImage() * –

12

Si solo desea dibujar los sprites, la clase Graphics de Java tiene un método drawImage que sacará un área específica de la imagen para tú. Solo tiene que especificar la imagen fuente, donde desea dibujar el objeto en su objeto Graphics (x, y, ancho, alto) y en qué marco de la imagen se encuentra el elemento (x, y, ancho, alto) .

Suponiendo que la anchura y la altura del sprite son de la misma anchura y altura que desea dibujar en el área de dibujo, se podría definir su propio método para dibujar un marco de sprites de la siguiente manera

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 es cuántas columnas hay en tu hoja de sprites. Las dos primeras líneas del método calculan la posición x cualquier y del marco del sprite en su hoja.

Esos grandes sprites en su hoja requerirán un manejo especial. Podrías dibujarlos con mosaicos (así estarías dibujando cuatro sprites para cada una de las imágenes grandes en este caso), o podrías calcular manualmente qué x, y, ancho y alto usar para esos sprites.

Si su hoja de sprites eran una hoja regular (todos los sprites del mismo tamaño) y se sitúan en un patrón de 5 x 15 como el suyo es, fueras a robar el bastidor 20 con la siguiente llamada al método

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

Aquí, xey son la posición que desea dibujar el sprite en su objeto Graphics, 15 es el número de columnas en su hoja de sprite, 19 es el marco (la numeración comienza en 0) y 25 es el ancho y alto de cada sprite (me aproximé).

Cuestiones relacionadas