为什么paintcomponent中的gif动画不起作用?

azpvetkf  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(353)

我正在创建一个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。
如果我还需要补充什么,请告诉我,并提前谢谢你!

yuvru6vn

yuvru6vn1#

你应该一直通过 this 作为最后的论据 drawImage 用绘画的方法。如果一个图像有多个帧,或者该图像加载在背景中,这会告诉组件在更多图像可用时重新绘制自己。
部件喷漆经常发生。它是由系统控制的,而不仅仅是通过调用组件的 repaint 方法。事实上,绘画每秒钟发生很多次是很常见的。许多程序员无法控制的系统事件可以触发绘制,例如用户移动窗口,或另一个窗口移动,甚至用户移动鼠标。
因此,绘制不应执行加载文件之类的缓慢操作。将图像的加载从绘制方法移到类的构造函数中。将图像对象存储在私有字段中,paintcomponent可以在其中反复使用它们,而无需为每次绘制运行重新加载它们。
由于绘制的时间超出了您的控制范围,因此在绘制方法中永远不要更改零部件的状态非常重要。移动 setFocusable 以及 requestFocus 从你的paintcomponent方法。这些调用应该在构建组件并将其添加到窗口的代码中。
最后,请注意,如果将应用程序打包到.jar文件中,从文件加载图像将不起作用。jar文件是一个压缩的归档文件;其中的条目不再是文件,它们只是归档文件中的字节序列。使用加载所有文件 getResource 将解决这个问题,因为getresource会查找类路径中的每个.jar文件。

uyhoqukh

uyhoqukh2#

没关系,我不得不复制“explosion.gif”。现在可以了!但是,请让我知道,如果有其他方法做这件事,更快,更有效。谢谢!

相关问题