为什么下一行的第一个精灵不可见?

时间:2013-08-29 20:11:24

标签: java sprite

我正在尝试做什么

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

问题:

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

插图:

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

雪碧表: 链接: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);             
    }       
}
}

我希望我能清楚地解释清楚,如果我没有,我道歉。

先谢谢你的帮助。

1 个答案:

答案 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.等到我花了很长时间寻找问题:)

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