gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:14:00 26 4
gpt4 key购买 nike

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

问题是,当我试图在屏幕上绘制多个炸弹时,它是从 GIF 的最后一帧开始绘制的。通过调查,我找到了重置 GIF 循环的方法 image.flush() 但现在的问题是,每次我在屏幕上绘制第二个炸弹时,屏幕上所有先前炸弹的 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 source code 判断,这似乎是因为每个人都只是通过 Toolkit.getImage 请求图像.然而,这种方法有一个很好的警告,它解释了手头的问题:

The underlying toolkit attempts to resolve multiple requests with the same filename to the same returned Image.

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

The returned Image is a new object which will not be shared with any other caller of this method or its getImage variant.

祝你好运。

关于java - Canvas 中同一动画 GIF 的多个实例 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11745804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com