2

我正在尝试做的事情

将我的精灵表转换为单独的缓冲图像,其中每个图像都将存储在一个数组中。
我正在做的方式是从上到下,从左到右。

问题:

当我遍历所有元素并到达下一行的第一个元素时。
图像是空白的,但是,下面的所有元素都按预期显示。

插图:

注意:每个元素的位置相同。

精灵表:链接: http: //imageshack.us/photo/my-images/153/ljsh.png/
看起来:链接:“ http://imageshack.us/photo/my-images/194/t3be。 png/ "
任何人都可以根据需要使用精灵表。
需要更多的图像声誉。:/

代码:

注意:我对 Java 还是很陌生,所以请温柔一点;)

我认为问题for出在方法中的循环内loadSpriteSheet
虽然具体是什么原因,我也不知道。

它是如何工作的,据我了解是:

  • 加载精灵表图像。
  • 缓冲图像数组是根据用户输入的行数和列数创建的。

计算大小SizeX = image.width / columnsSizeY = 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);             
    }       
}
}

我希望我清楚地解释了这一点,如果我没有解释清楚,我很抱歉。

提前感谢您的帮助。

4

1 回答 1

1

再次查看其他与精灵/精灵表相关的问题时,我遇到了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. 等我找了很久才问:)

尽管如此,我想知道问题的原因是什么。

于 2013-08-29T21:01:44.023 回答