【问题标题】:Why is the first sprite from the next row invisible?为什么下一行的第一个精灵不可见?
【发布时间】: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 相同。

标签: java sprite


【解决方案1】:

再次查看其他与精灵/精灵表相关的问题时,我遇到了BufferedImage.getSubimage。 (我在发布之前注意到有人建议这样做)

因此我立即实施了它。 我将loadSpriteSheet 方法中最里面的for 循环更改为。

    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. 等我找了很久才问:)

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

【讨论】:

  • 问题是设置转换的顺序。您设置了tX = 0,但在下一次抽奖之前没有设置翻译。我正要发布一个答案,但很高兴你找到了更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多