如果将子画面区域读入 BufferedImage
,则可以使用 getSubimage
方法获取精灵表的子画面。
该方法将采用所需子映像的 、 和 和,因此可以获得所需的子映像。由于大多数精灵的大小似乎相同,我认为大多数精灵都可以通过嵌套循环来迭代大图像。getSubimage
x
y
width
height
for
例如,如果使用 ImageIO
类(如 read
方法)加载子画面图像,并且每个子画面的大小为 10 x 10 像素,其中 5 行 x 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方法,该方法将为您拉出图像的特定区域。您只需要指定源图像,要在图形对象上绘制子画面的位置(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 任意 y 位置。
工作表中的那些大精灵将需要特殊处理。你可以用磁贴绘制它们(所以在这种情况下,你会为每个大图像绘制四个子画面),或者你可以手动找出用于这些子画面的x,y,宽度和高度。
如果您的 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 是要在图形对象上绘制子画面的位置,15 是 sprite 工作表中的列数,19 是帧(编号从 0 开始),25 是每个子画面的宽度和高度(我近似值)。
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-