Имам този лист със спрайтове:
Как мога да прочета този файл с изображение, за да извлека част от него, за да се използва като спрайт ?
Имам този лист със спрайтове:
Как мога да прочета този файл с изображение, за да извлека част от него, за да се използва като спрайт ?
Ако областта на спрайтовете се чете в 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
);
}
}
Уловката е, разбира се, че горният код ще работи само ако всички спрайтове са с еднакъв размер, така че ще трябва да се извърши известна корекция, за да работи за дадения лист със спрайтове. (Тъй като горният десен ъгъл изглежда е различен по размер от останалите.)
Ако просто искате да нарисувате спрайтовете, графичният клас на Java има drawImage метод, който ще извади конкретна област от изображението вместо вас. Просто трябва да посочите изходното изображение, къде искате да начертаете спрайта върху вашия графичен обект (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 са позицията, в която искате да начертаете спрайта върху вашия графичен обект, 15 е броят на колоните във вашия лист със спрайтове, 19 е рамката (номерирането започва от 0) и 25 е ширината и височината на всеки спрайт (аз приблизително).