如何在Java中使gif只运行一次并停止?

3
基本上我有一个游戏,当玩家(或敌人)死亡时,我想播放一个爆炸的gif动画,但我希望这个gif只播放一次。 我已经在一个类中设置好了所有内容,并且当我需要时,我有一个ArrayList来添加爆炸效果。目前,我已经将其设置为在gif的持续时间到达后将其删除(使用System.currentTimeMillis())。唯一的问题是,它不是很精确,有时gif会提前停止并消失,有时会翻转,这两种情况都会导致下一个gif从另一个gif离开的地方开始播放。 是否有某种方法、类、监听器或其他任何东西可以告诉我gif所在的帧数,或者它循环了多少次?我的代码可以完成其余的工作,我只需要在if语句中放入更好的内容,而不是这个:
g2D.drawImage(explosion, x - 150, y - 150, null);
    if(System.currentTimeMillis() - startingTime > 520){
        System.out.println(System.currentTimeMillis());//for testing accuracy
        Game.explosions.remove(this);
        explosion = null;
    }

如果您注释掉 System.out.println 这一行,那么您可能会得到更好的时间测量结果。 - Luiggi Mendoza
1个回答

6

通常的解决方法是不使用gif :)

大多数游戏会将gif的每个“帧”分别存储,并按顺序显示它们,而不是尝试让gif渲染正常工作。

System.currentTimeMillis()并不是非常准确的,而且在调用绘制函数之间可能会有很多背景活动发生(所有这些都会影响帧速率),因此我建议一般情况下不要依赖它。


嗯,我确实考虑过那样做。我担心这是一种新手的方法,但是嘿,它能工作。我只是想确保没有我不知道的“getCurrentFrame()”方法。而且,当我测试时,currentTimeMillis方法延迟了大约19毫秒才移除它。这非常明显。 - Monkeybro10
实际上,ImageReader.read(int) 可以读取一个动画 GIF 的单个帧。但是,将每个帧保留为单独的文件可能更容易。 - VGR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接