我有这个精灵表:
Pacman sprites http://i39.tinypic.com/145nvp.png
如何读取此图像文件以提取其中一部分用作精灵?
如果精灵区域读入a BufferedImage
,则该getSubimage
方法可用于获取精灵表单的子图像.
该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,width,height),以及精灵所在的图像的哪个帧(x,y,width,height) .
假设精灵的宽度和高度与您想要在绘图区域上绘制的宽度和高度相同,您可以定义自己的方法来绘制精灵帧,如下所示
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任意y位置.
您工作表中的那些大精灵需要特殊处理.您可以使用图块绘制它们(因此在这种情况下,您将为每个大图像绘制四个精灵),或者您可以手动确定要用于这些精灵的x,y,宽度和高度.
如果您的精灵表是一张普通纸(所有精灵都是相同的尺寸)并且它的排列方式是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对象上绘制sprite的位置,15是sprite表中的列数,19是帧(编号从0开始),25是每个的宽度和高度精灵(我近似).