Как извлечь часть этого изображения в Java? [закрыто]

StackOverflow https://stackoverflow.com/questions/621835

  •  05-07-2019
  •  | 
  •  

Вопрос

У меня есть этот спрайт-лист:

 Спрайты Пакмана

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

Это было полезно?

Решение

Если область спрайтов считывается в < code> 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
        );
    }
}

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top