Как извлечь часть этого изображения в 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

Если вы просто хотите рисовать спрайты, в классе 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 — это ширина и высота каждого. спрайт (я приблизил).

person Bill the Lizard    schedule 07.03.2009