我正在尝试做的事情
将我的精灵表转换为单独的缓冲图像,其中每个图像都将存储在一个数组中。
我正在做的方式是从上到下,从左到右。
问题:
当我遍历所有元素并到达下一行的第一个元素时。
图像是空白的,但是,下面的所有元素都按预期显示。
插图:
注意:每个元素的位置相同。
精灵表:链接: 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);
}
}
}
我希望我清楚地解释了这一点,如果我没有解释清楚,我很抱歉。
提前感谢您的帮助。