如何使用一张PNG图像来创建多个精灵?

5

如何使用单个PNG图片作为多个精灵? 我正在尝试制作一个简单的2D游戏,我不想有20多个不同的图像文件。 我只想把它们放在一个PNG文件中。

示例

Minecraft中的terrain.png(和items.png)具有不同的瓷砖,并且每个16x16像素区域用于块的不同纹理。

有人能提供一些代码和解释吗?


1
我认为“一些代码”部分是你的责任,但你可以使用一个包含精灵网格的精灵表,将其作为BufferedImage读入,然后使用BufferedImage的getSubImage(...)方法从图像中拆分出精灵。 - Hovercraft Full Of Eels
3
这里有个有用的链接:https://dev59.com/GHRB5IYBdhLWcg3wcm6d,希望对你有所帮助。 - Vlad
谢谢你们两个,这帮了我很多:D - Pim Schwippert
这种技术被称为:纹理图集。 :) - m4tx
请参考这个例子,我将一张图片分割成9个部分,用作GridLayout中按钮和标签的图标。 - Andrew Thompson
1个回答

2
我几年前写了一个Java游戏,所以希望可以给你一些有用的建议和代码示例...
你可以将精灵组织在一个单独的图像中,就像这样:

https://github.com/mikera/tyrant/blob/master/src/main/resources/images/creature32.png

上面的示例使用了32x32像素的精灵,您可以使用任何大小,但保持它们的规则有助于操作。

然后在游戏中绘制屏幕时,只需选择相应的精灵并将其绘制在正确的位置即可。

代码可能看起来像这样:

public void drawImage(Graphics g,double x, double y, int image) {
    int px = (int)((x - scrollx) * TILEWIDTH);
    int py = (int)((y - scrolly) * TILEHEIGHT);
    int sx = (image%20) * TILEWIDTH;
    int sy = TILEHEIGHT * (image/20);
    g.drawImage(sourceImage, px, py, px + TILEWIDTH,
            py + TILEHEIGHT, sx, sy, sx + TILEWIDTH, sy + TILEHEIGHT,
            null);
}

这里的int image是一个索引,用于指定在精灵图中使用哪个位置。将其增加1可将一个精灵向右移动,将其增加20可将一个精灵向下移动到精灵图中的下一行。

更完整的源代码可在此链接找到:https://github.com/mikera/tyrant/blob/master/src/main/java/mikera/tyrant/MapPanel.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接