2012-02-23 1 views
0

Я искал API для SpriteSheet, но я не смог найти ничего о том, как создать лист спрайтов с спрайтами разного размера.Использование листа спрайтов с спрайтами разного размера в Slick2D

Лист спрайта, который я использую, имеет ряд 16x16px плиток, ряд из 24x24px плиток под ним, ряд 8x8px под этим и так далее.

Первоначально, не используя Slick2D, я использовал BufferedImage.getSubimage() для получения каждого спрайта из временного BufferedImage листа спрайтов. Есть ли такой метод, который я могу использовать?

ответ

1

Я не верю, что есть способ сделать прямой суб-образ в текущей версии API, по крайней мере, на момент написания этой статьи.

Однако, есть три возможных варианта, которые я могу думать (в дополнение к выбору только при добавлении указанного метода вызывает себя - это open source все-таки):

  1. Вы могли бы показать несколько SpriteSheet объектов из тот же источник Image, по одному для каждого размера Sprite, если вы действительно хотите сохранить их в том же исходном файле.
  2. Вы можете взять экземпляр Image и позвонить getSubImage на нем, чтобы разделить Image на три изображения, по одному для каждого размера (24x24, 16x16 и т. Д.). Затем из этих суб-изображений создайте экземпляр SpriteSheets.
  3. Вы можете разбить исходный файл на отдельные файлы на основе размера. То есть, ваши 24x24 спрайт-ячейки в одном файле, 16x16 в другом файле и т. Д.
0

Вы можете просто сохранить изображение и использовать перегрузку метода DrawImage объекта Graphics, чтобы указать, где рисовать, какая часть изображения:

g.drawImage(image, x1, y1, x2, y2, srcX1, srcY1, srcX2, srcY2); 

См [Javadoc] (HTTP: // скользкий .cokeandcode.com/javadoc/org/newdawn/slick/Graphics.html # drawImage (org.newdawn.slick.Image, float, float, float, float, float, float, float, float))

Первый Параметр - это экземпляр изображения. Следующие два параметра определяют точку на экране, где начинается рендеринг. X2 и y2 определяют конечную точку рендеринга. Обычно x2 является x1 + spriteWidth, а y2 - y1 + spriteHeight, но вы можете изменить эти значения, чтобы нарисовать спрайт разных размеров. Последние четыре параметра работают одинаково, но они определяют область листа спрайта, который будет отображаться на экране.

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

int tileWidth = 8; 
int tileHeight = 8; 
int sourceX = 40; 
int sourceY = 8; //as its the sec 
int drawX = 34; 
int drawY = 65; 
g.drawImage(image, drawX, drawY, drawX + tileWidth, drawY + tileHeight 
    , sourceX, sourceY, sourceX + tileWidth, sourceY + tileHeight); 

Когда я работаю с spritesheet, я жестко вписаны значениями в некоторых (очень редко случаи, в основном тесты) и класс спрайтов, который хранит значения источника x1, x2, y1 и y2. Я могу упаковать их в список или карту, и у меня есть индекс спрайтов. Обычно я как-то генерирую определения, а затем сериализую список, поэтому я могу просто перезагрузить этот список, если мне это нужно.

Вот краткий пример моего определения XML (я храню ширину и высоту, а не значения x2 и y2 в xml, так как я считаю, что это более читаемо и удобнее для ручного редактирования.После десериализации я вычисляю значения x2 и y1):

<spriteSheet imageName="buildings" name="buildings"> 
    <sprite name="1x2 industry 01" spriteX="0" spriteY="0" width="50" height="112"/> 
    <sprite name="1x2 quarters 01" spriteX="50" spriteY="0" width="50" height="112"/> 
    <sprite name="1x1 spaceport 01" spriteX="243" spriteY="112" width="51" height="56"/> 
     ... 
</spriteSheet>