Canvas 中同一动画 GIF 的多个实例 (Java)

2024-02-22

所以我正在制作一款游戏,你可以在角色的位置放置炸弹。当炸弹显示并最终爆炸时,每个炸弹都与一个 GIF 图像相关联(想想炸弹人)。

问题是,当我尝试在屏幕上绘制多个炸弹时,它是从 GIF 的最后一帧绘制的。经过调查,我找到了 image.flush() 方法来重置 GIF cicle,但现在的问题是,每次我在屏幕上绘制第二个炸弹时,屏幕上所有先前炸弹的 GIF 循环都会重置。

这是我为每个炸弹构造的构造函数:

public Tnt(int x, int y){
    this.x = x;
    this.y = y;
    ImageIcon ii = new ImageIcon("src/main/resources/modelObjects/tnt.gif");
    image = ii.getImage();
    image.flush();
}

我创建的每个炸弹都会进入 ArrayList (listTnt) 并在 6 秒后被删除,所以我只绘制已经激活的炸弹。

下面是我的绘画方法:

public void draw(Graphics2D g2d, JPanel board){
    for(Tnt tnt: listTnt){          
        g2d.drawImage(tnt.getImage(), tnt.getX(), tnt.getY(), board);
    }
}

编辑:似乎问题是 ImageIcon,因为它使用 Toolkit.getImage 重用图像。相反,Toolkit.createImage 创建一个不可重用的图像。

这是我的新 Tnt 构造函数,运行良好:

public Tnt(int x, int y){
    this.x = x;
    this.y = y;
    Toolkit t = Toolkit.getDefaultToolkit ();
    image = t.createImage("src/main/resources/modelObjects/tnt.gif");
}

我什至不需要image.flush()现在。谢谢你们。


底层的Image在每个之间重复使用ImageIcon。 判断通过OpenJDK 源代码 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/javax/swing/ImageIcon.java#147,这似乎是因为每个人都只是通过以下方式请求图像工具包.getImage http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html#getImage(java.lang.String)。 然而,此方法有一个巧妙的警告,它解释了当前的问题:

底层工具包尝试将具有相同文件名的多个请求解析到同一返回的图像。

相反,您应该跳过ImageIcon完全步骤(因为首先不必要地使用 Swing 类是不合适的),而是调用工具包.createImage http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html#createImage(java.lang.String),文档中指出:

返回的 Image 是一个新对象,不会与此方法或其 getImage 变体的任何其他调用者共享。

祝你好运。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Canvas 中同一动画 GIF 的多个实例 (Java) 的相关文章

随机推荐