将我的精灵表转换为单独的缓冲图像,其中每个都将存储在一个数组中。
我正在做的方式是从上到下,从左到右。
当我浏览所有元素并到达下一行的第一个元素时。
图像为空白,但是,所有元素都按预期显示。
雪碧表:
链接:http://imageshack.us/photo/my-images/153/ljsh.png/
看来:
链接:“http://imageshack.us/photo/my-images/194/t3be.png/”
如果他们愿意,任何人都可以使用精灵表
需要更多的图像声誉。 :/
我认为问题出在for
方法中的loadSpriteSheet
循环内
虽然原因究竟是什么,但我不知道。
如何运作,根据我的理解是:
尺寸计算为SizeX = image.width / columns
,SizeY = image.height / rows
。
“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);
}
}
}
我希望我能清楚地解释清楚,如果我没有,我道歉。
先谢谢你的帮助。
答案 0 :(得分:1)
再看一遍,在其他与sprite / sprite表相关的问题上,我遇到了BufferedImage.getSubimage
。 (我在发布之前注意到有人建议)
因此我立即实施了它。
我将for
方法中最内层的loadSpriteSheet
循环更改为。
for(int y = 0; y < rows; y++) {
for(int x = 0; x < columns; x++) {
spriteSheet[spriteInd] = new BufferedImage(spriteSX, spriteSY, BufferedImage.TYPE_INT_ARGB);
System.out.println(spriteInd + ", tX: " + tX + ", tY: " + tY);
spriteSheet[spriteInd] = image.getSubimage(tX, tY, spriteSX, spriteSX);
tX += spriteSX;
spriteInd++;
}
tX = 0;
tY += spriteSY;
}
它更短,实际上现在有效:D
因此,我从中学到了一些东西
1.做更多的谷歌搜索和一般搜索
2.检查api更多。
3.等到我花了很长时间寻找问题:)
尽管如此,我想知道问题的原因是什么。