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

Mig*_*ega 3 java swing gif animated-gif graphics2d

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

问题是,当我试图在屏幕上绘制多个炸弹时,它是从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();
}
Run Code Online (Sandbox Code Playgroud)

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

这是我绘制的方法:

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

编辑:似乎问题是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");
}
Run Code Online (Sandbox Code Playgroud)

image.flush()现在甚至都不需要.谢谢你们.

old*_*inb 6

底层Image被重复使用ImageIcon.从OpenJDK源代码来看,似乎是因为每个人只是通过Toolkit.getImage请求Image .然而,这种方法有一个很好的警告,它解释了手头的问题:

底层工具包尝试将具有相同文件名的多个请求解析为同一返回的Image.

相反,您应该ImageIcon完全跳过该步骤(因为首先不必要地使用Swing类是不合适的),而是调用Toolkit.createImage,它在文档中说明:

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

祝好运.