【发布时间】:2013-09-02 10:19:48
【问题描述】:
我想要做什么
将我的精灵表转换为单独的缓冲图像,其中每个都将存储在一个数组中。
我正在做的方式是从上到下,从左到右。
问题:
当我遍历所有元素并到达下一行的第一个元素时。
图像是空白的,但是,下面的所有元素都按预期显示。
插图:
注意:每个元素的位置相同。
精灵表:
链接:http://imageshack.us/photo/my-images/153/ljsh.png/
看起来:
链接:“http://imageshack.us/photo/my-images/194/t3be.png/”
任何人都可以根据需要使用精灵表。
需要更多的图像声誉。 :/
代码:
注意:我对 Java 还是很陌生,所以请温柔一点 ;)
我认为问题出在for 循环中,该循环位于loadSpriteSheet 方法中。
虽然具体是什么原因,我也不知道。
它是如何工作的,据我了解是:
- 加载精灵表图像。
- 缓冲图像数组是根据用户输入的行数和列数创建的。
大小计算SizeX = image.width / columns,SizeY = image.height / rows。
- 图形对象绘制到数组中的当前元素。
- 精灵表被移动 -SizeX。
- 绘制下一个元素。
- 重复直到 x = 列。
- 开始下一行,移动精灵表 -SizeY。
- 继续和以前一样。
“System.out”部分显示了 tX 和 tY 的位置,这正是我预期的位置。
public class SpriteSheet extends ImageObject {
// Variables
protected BufferedImage[] spriteSheet;
protected AffineTransform sprSheetAt;
// Getters
public int getLength() {return spriteSheet.length;}
// Setters
// Constructor
public SpriteSheet(JFrame a) {
super(a);
}
public void loadSpriteSheet(String filename, int rows, int columns) {
try {
image = ImageIO.read(new FileInputStream(filename));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
sprSheetAt = AffineTransform.getTranslateInstance(0, 0);
// Size of sprite image.
int spriteSX = image.getWidth() / columns;
int spriteSY = image.getHeight() / rows;
int tX = 0;
int tY = 0;
spriteSheet = new BufferedImage[rows * columns];
int spriteInd = 0;
for(int y = 0; y < rows; y++) {
for(int x = 0; x < columns; x++) {
Graphics2D g;
if(spriteInd >= spriteSheet.length) {
break;
}
spriteSheet[spriteInd] = new BufferedImage(spriteSX, spriteSY, BufferedImage.TYPE_INT_ARGB);
g = spriteSheet[spriteInd].createGraphics();
g.drawImage(image, sprSheetAt, null);
g.dispose();
System.out.println(spriteInd + ", tX: " + tX + ", tY: " + tY);
tX -= spriteSX;
spriteInd++;
sprSheetAt.setToTranslation(tX, tY);
}
tX = 0;
tY -= spriteSY;
}
}
public void drawSprite(Graphics2D g, int spriteInd) {
g2d = g;
if(alive) {
g2d.drawImage(spriteSheet[spriteInd], 0, 0, frame);
}
}
}
我希望我解释清楚了,如果我没有解释清楚,我很抱歉。
非常感谢您的帮助。
【问题讨论】:
-
我不确定为什么要减去 tx 和 ty,因为它们从 0x0 开始。您还可以使用BufferedImage#subImage 从 中返回一个新的 BufferedImage。伊恩 BufferedImage
-
谢谢。至于我减法的原因,想象一张卡片,剪裁成精灵大小的正方形,将原始图像放在卡片下方,将其对齐,使孔和第一个精灵对齐。为了沿 x 轴移动到下一个精灵(在这种情况下无论如何),您必须移动原始的
-x,与下一行的y相同。