2009-03-07 17 views
30

У меня есть этот спрайт лист:Как извлечь часть этого изображения в Java?

Pacman sprites http://i39.tinypic.com/145nvp.png

Как я могу прочитать этот файл изображения, чтобы извлечь его часть, которая будет использоваться в качестве sprite?

+1

Это может быть удобно для http://gamedev.stackexchange.com/. –

ответ

46

Если область спрайтов считывается в BufferedImage, метод getSubimage может использоваться для получения провидного листа спрайта.

Метод getSubimage примет x, y, и width и height желаемого субизображения, так что желаемый спрайтов может быть получено. Поскольку большинство спрайтов, похоже, имеют одинаковый размер, я думаю, что большинство из них может быть восстановлено вложенным циклом for для повторения большого изображения.

Например, если спрайт изображение загружаются с помощью ImageIO класса (например, методы read), и каждый из спрайтов составляют 10 пикселей на 10 пикселей по размеру, где 5 строк по 5 столбцам спрайтов, спрайты могут быть получен следующим образом:

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

Подвох, конечно, выше код будет работать только тогда, когда все спрайты имеют одинаковый размер, так что необходимо будет некоторая корректировка производится для того, чтобы работать для данный лист спрайта. (Поскольку верхний правый угол, по-видимому, отличается по размеру от других.)

+0

какой-нибудь код пожалуйста? –

+0

Извините, что я ошибочно нажал кнопку ответа на сообщение. Я добавлю больше ответа. – coobird

+1

выглядит как * i * и * j * индексы должны быть заменены на * getSubImage() * вызов –

12

Если вы просто хотите нарисовать спрайты, класс графики Java имеет метод drawImage, который вытащит определенную область изображения для вы. Вам просто нужно указать исходное изображение, в котором вы хотите нарисовать спрайт на объекте Graphics (x, y, width, height) и в каком кадре изображения находится спрайт (x, y, ширина, высота) ,

Предполагая, что ширина и высота спрайта имеют одинаковую ширину и высоту, что вы хотите нарисовать на области рисования, вы можете определить свой собственный метод, чтобы нарисовать спрайт кадр следующим образом

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 сколько столбцов есть в вашем листе спрайта. Первые две строки метода вычисляют x любой y позиции рамки спрайта в вашем листе.

Эти большие спрайты на вашем листе потребуют специальной обработки. Вы могли бы нарисовать их с помощью плиток (поэтому в этом случае вы будете рисовать четыре спрайта для каждого из больших изображений), или вы можете вручную определить, какие x, y, width и height использовать для этих спрайтов.

Если ваш спрайтов лист был обычный лист (все спрайты одинакового размера) и она была расположена по схеме 5 х 15, как ваш, вы бы сделать 20-й кадр с помощью метода следующего вызова

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

Здесь x и y - это позиция, в которой вы хотите нарисовать спрайт на своем графическом объекте, 15 - количество столбцов на вашем листе спрайта, 19 - кадр (нумерация начинается с 0), а 25 - ширина и высота каждый спрайт (я аппроксимировал).

 Смежные вопросы

  • Нет связанных вопросов^_^