在Slick2D中使用具有不同大小的精灵的精灵表

时间:2012-02-23 21:56:46

标签: java slick2d sprite-sheet

我搜索了SpriteSheet的API,但是我找不到任何关于如何制作具有不同大小的精灵的精灵表。

我使用的精灵表有一排16x16px的瓷砖,下面是一排24x24px的瓷砖,下面是一排8x8px,依此类推。

最初,不使用Slick2D,我使用BufferedImage.getSubimage()从精灵表的临时BufferedImage中获取每个精灵。我可以使用类似的方法吗?

2 个答案:

答案 0 :(得分:1)

我不相信在当前版本的API中有一种直接子图像的方法,至少在撰写本文时是这样。

但是,我可以想到三种可能的选项(除了自己添加所述方法调用的选项之外 - 毕竟它是open source):

  1. 如果您真的想将它们保存在同一个源文件中,您可以从同一个源SpriteSheet实例化几个Image个对象,每个对象用于一个Sprite大小。
  2. 您可以使用Image实例,并在其上调用getSubImageImage拆分为三个图像,每个图像一个(24x24,16x16,依此类推)。然后,从这些子图像中,实例化SpriteSheets
  3. 您可以根据大小将源文件拆分为单独的文件。也就是说,将24x24精灵单元格放在一个文件中,将16x16放在另一个文件中,依此类推。

答案 1 :(得分:0)

你可以保留一个Image并使用Graphics对象的drawImage方法的重载来指定绘制图像的哪个部分的位置:

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,但是您可以更改这些值以绘制不同大小的sprite。 最后四个参数的工作方式相同,但它们定义了精灵表的区域,将在屏幕上绘制。

如果我们采用您的示例并且我们想要从第三行绘制第二个图块,则调用将如下所示:

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时,我在某些(非常罕见的情况下,主要是测试)和sprite类中有硬编码值,它们存储了源x1,x2,y1和y2值。我可以在列表或地图中打包一堆它们,就像我有一个精灵索引一样。通常我以某种方式生成定义然后序列化列表,所以我可以简单地重新加载该列表,如果我需要它。

这是我的XML定义的一个简短示例(我存储宽度和高度而不是x2中的x2和y2值,因为我发现它更易于人工阅读并且更便于手动编辑。反序列化后我计算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>