У меня есть этот лист спрайтов:
Как я могу прочитать этот файл изображения, чтобы извлечь его часть для использования в качестве спрайта ?
У меня есть этот лист спрайтов:
Как я могу прочитать этот файл изображения, чтобы извлечь его часть для использования в качестве спрайта ?
Если область спрайтов читается в BufferedImage
, getSubimage
можно использовать для получения части изображения листа спрайтов.
Метод getSubimage
возьмет x
, y
, а также width
и height
желаемого фрагмента изображения, чтобы можно было получить желаемый спрайт. Поскольку большинство спрайтов кажутся одинакового размера, я думаю, что большинство из них можно получить с помощью вложенного цикла for
для повторения большого изображения.
Например, если изображение спрайта загружается с помощью ImageIO
< /a> (например, 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
);
}
}
Загвоздка, конечно, в том, что приведенный выше код будет работать только в том случае, если все спрайты имеют одинаковый размер, поэтому для работы с данным листом спрайтов потребуется выполнить некоторую настройку. (Поскольку верхний правый угол кажется другим по размеру.)
Если вы просто хотите рисовать спрайты, в классе Graphics Java есть drawImage метод, который вытащит для вас определенную область изображения. Вам просто нужно указать исходное изображение, где вы хотите нарисовать спрайт на вашем объекте Graphics (x, y, ширина, высота), и в каком кадре изображения находится спрайт (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, ширина и высота использовать для этих спрайтов.
Если бы ваш лист спрайтов был обычным листом (все спрайты одинакового размера) и был бы расположен по шаблону 5 x 15, как у вас, вы бы нарисовали 20-й кадр с помощью следующего вызова метода
Toolkit tk = Toolkit.getDefaultToolkit();
Image pacman = tk.getImage(getURL("pacman.png"));
...
drawFrame(pacman, g2d, x, y, 15, 19, 25, 25);
Здесь x и y — это позиция, в которой вы хотите нарисовать спрайт на вашем объекте Graphics, 15 — это количество столбцов в вашем листе спрайтов, 19 — это кадр (нумерация начинается с 0), а 25 — это ширина и высота каждого. спрайт (я приблизил).