JAVA:尝试读取 SpriteSheet 时未成形的 Sprite

Posted

技术标签:

【中文标题】JAVA:尝试读取 SpriteSheet 时未成形的 Sprite【英文标题】:JAVA: Unformed Sprite When trying to Read SpriteSheet 【发布时间】:2015-10-24 04:38:01 【问题描述】:

所以我是一个尝试使用 ImageIO 的初学者。有人能告诉我为什么我得到这个像素化不完整的精灵吗? 这是代码

public BufferedImage getImage(String location)

    try 
    
        File file = new File(location);

        image = ImageIO.read(file);
     
    catch (IOException e) 
    
        System.err.println("It don't work!!");
        e.printStackTrace();
    
    return image;

我用这个方法来显示它

public void paint(Graphics g)

    g.drawImage(getImage("Numbers/icon0.png"), 0, 0, 32, 32, null);
    repaint();

这就是它给我的东西

【问题讨论】:

【参考方案1】:

如果您想显示精灵的第一个(单个)单元格,您可能打算这样写:

g.drawImage(getImage("Numbers/icon0.png").getSubimage(0, 0, 32, 32), 0, 0, null);

注意getSubimage(x, y, w, h) 部分,以获取单个单元格。

如果你想绘制整个精灵表,你可以使用:

g.drawImage(getImage("Numbers/icon0.png"), 0, 0, null);

您的原始代码将绘制整个精灵表,重新缩放为 32x32。


PS:您可能不应该从paint 方法调用repaint(),因为这将创建一个无限的重绘循环。如果您希望您的组件重绘,请使用某种计时器以固定的时间间隔重绘您的组件。

PPS:您可能不应该在 paint 方法中执行 I/O(即读取图像),因为任何 I/O 操作都可能需要时间并且会使您的 UI 迟缓且无响应。这也是不必要的,因为每次重新绘制时精灵表都不会改变。相反,先读取图像,然后仅在 paint 方法中绘制它。

【讨论】:

以上是关于JAVA:尝试读取 SpriteSheet 时未成形的 Sprite的主要内容,如果未能解决你的问题,请参考以下文章

在 XNA 中读取 spritesheet XML 文件

为啥在尝试读取记录集字段时未定义访问 vba 抛出子或函数?

Spritesheet 动画 easeljs-0.7.1.min.js

C ++读取文件时未处理的异常

多个小型 spritesheet 或一个巨大的 spritesheet 以提高性能? ---(java游戏开发)[关闭]

无法导入 json spritesheet