Pergunta

Eu tenho essa folha de sprite:

Pacman sprites

Como posso ler este arquivo de imagem para extrair parte dela para ser usado como um Sprite ?

Foi útil?

Solução

Se a área de sprites ler em um BufferedImage , a getSubimage método pode ser usado para obter uma sub-imagem da folha de sprite.

O método getSubimage levará o x, y, e o width e height da sub-imagem desejada, de modo que o sprite desejado pode ser obtido. Como a maioria dos sprites parecem ser do mesmo tamanho, eu acho que a maioria deles pode ser recuperada por um loop aninhado for para percorrer a imagem grande.

Por exemplo, se a imagem sprite está carregado usando a ImageIO classe (como o read método), e cada um sprite está 10 pixels por 10 pixels de tamanho, onde são 5 linhas por 5 colunas de sprites, os sprites pode ser obtido pelo seguinte:

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

O problema é, naturalmente, o código acima só funcionará se todos os sprites são do mesmo tamanho, por isso não precisa ser algum ajuste realizado, a fim de trabalho para o dada folha de sprite. (Como o canto superior do lado direito parece ser diferente em tamanho dos outros.)

Outras dicas

Se você quiser apenas para desenhar os sprites, classe Graphics de Java tem um drawImage método que vai puxar uma área específica da imagem para você. Você apenas tem que especificar a imagem de origem, onde você quer desenhar o sprite em seu objeto Graphics (x, y, largura, altura), e em que quadro da imagem do sprite está localizado (x, y, largura, altura) .

Assumindo que a largura ea altura do sprite são a mesma largura e altura que você quer desenhar na área de desenho, você pode definir seu próprio método para desenhar um quadro do sprite da seguinte maneira

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 é quantas colunas existem na sua folha de sprite. As primeiras duas linhas do método calcular o x y qualquer posição da estrutura do sprite na sua folha.

Aqueles grandes sprites em sua folha será requerem um tratamento especial. Você poderia atraí-los com azulejos (assim você estaria desenhando quatro sprites para cada uma das grandes imagens, neste caso), ou você pode descobrir manualmente o que x, y, largura e altura, para uso para aqueles sprites.

Se a sua folha de sprite fosse uma folha normal (todos os sprites do mesmo tamanho) e foi organizado em um padrão 5 x 15 como o seu é, você gostaria de chamar a moldura 20 com a chamada de método seguinte

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

Aqui, x e y são a posição que você quer desenhar o sprite em seu objeto Graphics, 15 é o número de colunas em sua folha de sprite, 19 é o quadro (numeração começa em 0), e 25 é a largura e altura de cada Sprite (I aproximado).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top