我有这个png图片:
和一个字符串,说" Hello World"。为了映射LWJGL的纹理坐标,我需要知道PNG中每个16x16字符的X和Y位置。我完全迷失了如何做到这一点......任何人?
答案 0 :(得分:1)
从这样的事情开始:
final int spriteWidth = 16;
final int spriteHeight = 16;
...
int rows = sheet.getWidth()/spriteWidth;
int cols = sheet.getHeight()/spriteHeight;
BufferedImage sheet = ImageIO.read(new File("\\a\b\\c\\sprite_file.png"));
BufferedImage[] images = new BufferedImage[rows * cols];
for(int y = 0; y < cols; y++) {
for(int x = 0; x < rows; x++) {
images[y * x] = sheet.getSubImage(x * rows, y * cols, spriteWidth, spriteHeight);
}
}
然后像这样制作最终的int变量:
public static final int SPRITE_0 = 0;
public static final int SPRITE_1 = 1;
...
并像这样访问:
images[SPRITE_0]
编辑:
考虑到@MadProgrammer所说的内容,我建议您将图像分成两部分,如下所示:
(在红线处分开)
然后简单地改变代码来处理两个不同的部分。除变量final int spriteWidth
和final int spriteHeight
外,代码将保持不变。我相信你自己能解决这个问题。
编辑2:
如果你只想要每个精灵左上角的x和y co-ords,请执行以下操作:
final int spriteWidth = 16;
final int spriteHeight = 16;
...
int rows = sheet.getWidth()/spriteWidth;
int cols = sheet.getHeight()/spriteHeight;
Point[] spriteTopLeftCorner = new Point[rows * cols];
for(int y = 0; y < sheet.getHeight(); y += spriteHeight) {
for(int x = 0; x < sheet.getWidth(); x += spriteWidth) {
spriteTopLeftCorner[y/spriteHeight * x/spriteWidth] = new Point(y, x);
}
}
你仍然需要在这个Array
中创建代表每个精灵索引的变量,否则你不会知道你正在取出什么精灵。
这样做:
public static final int SPRITE_0 = 0;
public static final int SPRITE_1 = 1;
...
并像这样访问:
spriteTopLeftCorner[SPRITE_0];