Pregunta

Tengo esta hoja de sprites:

 Pacman sprites

¿Cómo puedo leer este archivo de imagen para extraer parte de él y usarlo como sprite ?

¿Fue útil?

Solución

Si el área de sprites se lee en < código> BufferedImage , el getSubimage se puede usar para obtener una subimagen de la hoja de sprite.

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

Por ejemplo, si la imagen del sprite se carga utilizando ImageIO (como la clase read ), 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 son del mismo tamaño, por lo que será necesario realizar algunos ajustes para poder trabajar con la hoja de sprites dada. (Como la esquina superior derecha parece ser diferente en tamaño a las otras).

Otros consejos

Si solo desea dibujar los sprites, la clase de gráficos de Java tiene un drawImage método que extraerá un área específica de la imagen para usted. Solo tiene que especificar la imagen de origen, donde desea dibujar el sprite en su objeto de Gráficos (x, y, ancho, alto), y en qué marco de la imagen se encuentra el sprite (x, y, ancho, alto) .

Suponiendo que el ancho y el alto 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 la cantidad de columnas que hay en tu hoja de sprite. Las dos primeras líneas del método calculan la x cualquier posición y del marco de sprite en su hoja.

Esos sprites grandes 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 altura, usar para esos sprites.

Si su hoja de sprites fuera una hoja regular (todos los sprites del mismo tamaño) y estuviera dispuesta en un patrón de 5 x 15 como el suyo, dibujaría el vigésimo cuadro con el siguiente método de llamada

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 en la que desea dibujar el sprite en su objeto de Gráficos, 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 altura de cada sprite (me aproximo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top