Si hallas algún fallo en tu código o proyecto, recuerda probar siempre en un entorno de testing antes añadir el código al trabajo final.
Solución:
Si el área de sprites se lee en un BufferedImage
la getSubimage
El método se puede utilizar para obtener una subimagen de la hoja de sprites.
los getSubimage
El método tomará la x
, y
y el width
y height
de la subimagen deseada, por lo que se puede obtener el sprite deseado. Dado que la mayoría de los sprites parecen tener el mismo tamaño, creo que la mayoría de ellos pueden recuperarse mediante un anidado for
bucle para iterar a través de la imagen grande.
Por ejemplo, si la imagen del sprite se carga usando el ImageIO
clase (como el read
método), y cada sprite tiene un tamaño de 10 píxeles por 10 píxeles, donde hay 5 filas por 5 columnas de sprites, los sprites se pueden obtener de la siguiente manera:
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
);
El problema es, por supuesto, que el código anterior solo funcionará si todos los sprites tienen el mismo tamaño, por lo que será necesario realizar algunos ajustes para que funcione para la hoja de sprites dada. (Ya que la esquina superior derecha parece ser diferente en tamaño a las demás).
Si solo desea dibujar los sprites, la clase Graphics de Java tiene un método drawImage que extraerá un área específica de la imagen para usted. Solo tiene que especificar la imagen de origen, dónde desea dibujar el sprite en su objeto Graphics (x, y, ancho, alto) y en qué marco de la imagen se encuentra el sprite (x, y, ancho, alto) .
Suponiendo que el ancho y la altura del sprite son del mismo ancho y alto que desea dibujar en el área de dibujo, puede definir su propio método para dibujar un marco de sprite 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 en cualquier y del marco de sprite en su hoja.
Esos grandes sprites en tu hoja requerirán un manejo especial. Puede dibujarlos con mosaicos (por lo que estaría dibujando cuatro sprites para cada una de las imágenes grandes en este caso), o podría averiguar manualmente qué x, y, ancho y alto usar para esos sprites.
Si su hoja de sprites fuera una hoja normal (todos los sprites del mismo tamaño) y estuviera dispuesta en un patrón de 5 x 15 como el suyo, dibujaría el cuadro 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í, x e y son la posición en la 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é).