Как да извлека част от това изображение в Java? [затворено]

Имам този лист със спрайтове:

„Спрайтове

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


person Ali    schedule 07.03.2009    source източник
comment
Това може да е подходящо за gamedev.stackexchange.com.   -  person James P.    schedule 21.03.2013


Отговори (2)


Ако областта на спрайтовете се чете в 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
        );
    }
}

Уловката е, разбира се, че горният код ще работи само ако всички спрайтове са с еднакъв размер, така че ще трябва да се извърши известна корекция, за да работи за дадения лист със спрайтове. (Тъй като горният десен ъгъл изглежда е различен по размер от останалите.)

person coobird    schedule 07.03.2009
comment
Съжалявам за това, по погрешка натиснах бутона за отговор на публикуване. Ще добавя още към отговора. - person coobird; 07.03.2009
comment
изглежда, че индексите i и j трябва да бъдат разменени в извикването на getSubImage() - person guido; 24.05.2012
comment
@guido Благодаря ви, че посочихте грешката! Кодът е коригиран. - person coobird; 23.06.2012
comment
Някакви идеи как спрайтът може да бъде преместен? Или с помощта на панел, или директно в боя? - person James P.; 21.03.2013

Ако просто искате да нарисувате спрайтовете, графичният клас на 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 е ширината и височината на всеки спрайт (аз приблизително).

person Bill the Lizard    schedule 07.03.2009