我有这个精灵表:
如何读取此图像文件以提取其中的一部分用作精灵?
如果 sprite 区域读入 a BufferedImage
,则该getSubimage
方法可用于获取 sprite sheet 的子图像。
该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 的 Graphics 类有一个drawImage方法,该方法将为您拉出图像的特定区域。您只需要指定源图像,要在 Graphics 对象上绘制精灵的位置(x,y,宽度,高度),以及精灵位于图像的哪个帧(x,y,宽度,高度) .
假设精灵的宽度和高度与您要在绘图区域上绘制的宽度和高度相同,您可以定义自己的方法来绘制精灵帧,如下所示
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 any y 位置。
工作表中的那些大精灵需要特殊处理。您可以用瓷砖绘制它们(因此在这种情况下,您将为每个大图像绘制四个精灵),或者您可以手动确定用于这些精灵的 x、y、宽度和高度。
如果您的 sprite 表是常规表(所有 sprite 大小相同)并且按照 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 是每个的宽度和高度精灵(我近似)。