Использование листа спрайтов с различными размерами спрайтов в Slick2D - PullRequest
0 голосов
/ 24 февраля 2012

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

Используемый мной спрайт-листпод ним есть ряд плиток размером 16x16 пикселей, ряд плиток размером 24x24 пикселей, строка размером 8x8 пикселей и т. д.

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

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

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

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

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

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

См. [Javadoc] (http://slick.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>
...