我的代码在applet中绘制我的图像,但它是一个动画gif,它在第一帧停止,好像它是一个单独的图像。
它应该是幽灵般可怕的骷髅舞,但他只是静止不动。
这是我的代码:
import java.util.*;
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.*;
public class Spooky extends Applet
{
Image scary, trumpet, walking;
MediaTracker mt;
AudioClip spoopy;
Graphics buffer;
Image offscreen;
Dimension dim;
public void init()
{
setLayout(null);
mt = new MediaTracker(this);
mt.addImage(scary,1);
mt.addImage(trumpet,1);
mt.addImage(walking,1);
spoopy = getAudioClip(getDocumentBase(),"spoopy.wav");
spoopy.loop();
}
public void paint(Graphics g)
{
try
{
URL url = this.getClass().getResource("spooky.gif");
BufferedImage img;
img = ImageIO.read(url);
mt.addImage(img,1);
g.drawImage(img,0,0,300,300,this);
}
catch(IOException e)
{
}
}
}
答案 0 :(得分:2)
问题是ImageIO.read(url);
方法。不知道怎么,但在内部,它弄乱了gif的阅读。相反,从网址构建ImageIcon
并使用getImage()
的{{1}}获取ImageIcon
另外,请勿使用Image
方法加载图像。将其加载到paint
方法中。
init
答案 1 :(得分:1)
我不知道它是否有帮助,但通常这是一个问题,需要一个单独的Thread / Runnable用于动画,另一个代码用于代码。至少那是我在制作小游戏时遇到的问题。尝试这个,让我知道它是否有帮助:)
检查一下:Displaying Gif animation in java
更新:我发现的一个例子(http://examples.oreilly.com/jswing2/code/)使用支持gif的JApplet(Applet是旧的)
// AnimationApplet.java
// The classic animation applet rewritten to use an animated GIF.
//
import javax.swing.*;
public class AnimationApplet extends JApplet {
public void init() {
ImageIcon icon = new ImageIcon("images/rolling.gif"); // animated gif
getContentPane().add(new JLabel(icon));
}
}
你是否尝试不发出声音来看动画是否单独起作用?可能是声音需要单独的Runnable / Thread
答案 2 :(得分:0)
我有类似的问题。 Michail Michailidis's answer是一种解决方案。但是,如果您尝试从InputStream加载GIF(在我的情况下就是这种情况),则将需要其他解决方案。在这种情况下,我将使用Toolkit类来加载图像,更具体地说,是Toolkit#createImage(byte[])
:
Image image;
try(InputStream stream = this.getClass().getResourceAsStream("/someImage.gif")) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = stream.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
image = Toolkit.getDefaultToolkit().createImage(buffer.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}