我正在创建一个java游戏,在这个游戏中,我有一个可以被用户移动的飞机,但是如果飞机撞到任何一侧,它应该爆炸——这意味着在那个位置应该发生爆炸。我使用了如下链接:为什么在paintcomponent()中使用gif动画时不设置动画?和其他一些来找出如何动画一个gif,然而,我的代码不工作。
以下是相关代码:
ImageIcon ii = new ImageIcon(this.getClass().getResource("explosion.gif"));
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(ii.getImage(), planeX, planeY, this);
System.out.println("drawn");
虽然“drawing”正在控制台上打印出来,但爆炸gif不会加载。我检查了文件名,它是正确的。然而,我确实在代码中的其他地方使用了相同的gif,而且它在那里工作,那么是否有什么东西可以防止gif在java中被两次使用呢?
下面是我的整个paintcomponent()方法:
super.paintComponent(g);
setFocusable(true);
requestFocus();
background = new ImageIcon("bg.png").getImage();
g.drawImage(background, -6, 0, 700, 700, null); //background of JPanel
if (!hit) g.drawImage(plane, planeX, planeY, planeLen, planeHei, null); //only draw plane if not exploded
else if (count == 0)
{
ImageIcon ii = new ImageIcon(this.getClass().getResource("explosion.gif"));
Graphics2D g2d = (Graphics2D)g;
g2d.drawImage(ii.getImage(), planeX, planeY, this); //doesn't work
System.out.println("drawn"); //printed
}
title = new ImageIcon("title.png").getImage(); //transparent, is drawn
g.drawImage(title, -9, 20, 700, 218, null);
title2 = new ImageIcon("title2.png").getImage(); //transparent, is drawn
g.drawImage(title2, 10, 245, 670, 20, null);
我检查了标题和标题2,它们是透明的,这意味着爆炸应该被看到。我甚至在那两张照片下面试过,爆炸还是看不见。我也在这个面板上使用jbuttons和keylisters。
如果我还需要补充什么,请告诉我,并提前谢谢你!
2条答案
按热度按时间yuvru6vn1#
你应该一直通过
this
作为最后的论据drawImage
用绘画的方法。如果一个图像有多个帧,或者该图像加载在背景中,这会告诉组件在更多图像可用时重新绘制自己。部件喷漆经常发生。它是由系统控制的,而不仅仅是通过调用组件的
repaint
方法。事实上,绘画每秒钟发生很多次是很常见的。许多程序员无法控制的系统事件可以触发绘制,例如用户移动窗口,或另一个窗口移动,甚至用户移动鼠标。因此,绘制不应执行加载文件之类的缓慢操作。将图像的加载从绘制方法移到类的构造函数中。将图像对象存储在私有字段中,paintcomponent可以在其中反复使用它们,而无需为每次绘制运行重新加载它们。
由于绘制的时间超出了您的控制范围,因此在绘制方法中永远不要更改零部件的状态非常重要。移动
setFocusable
以及requestFocus
从你的paintcomponent方法。这些调用应该在构建组件并将其添加到窗口的代码中。最后,请注意,如果将应用程序打包到.jar文件中,从文件加载图像将不起作用。jar文件是一个压缩的归档文件;其中的条目不再是文件,它们只是归档文件中的字节序列。使用加载所有文件
getResource
将解决这个问题,因为getresource会查找类路径中的每个.jar文件。uyhoqukh2#
没关系,我不得不复制“explosion.gif”。现在可以了!但是,请让我知道,如果有其他方法做这件事,更快,更有效。谢谢!