当前页面: 开发资料首页 → Java 专题 → java动画——连续图像绘制
java动画——连续图像绘制
摘要: java动画——连续图像绘制
java动画——连续图像绘制
// 程序:连续图像绘制
// 范例文件:SerialImage.java
import java.awt.*;
import java.applet.*;
import java.awt.image.*;
public class SerialImage extends Applet implements Runnable
{
int AppletWidth,AppletHeight,currentImage;
Image Animation[],SerialImage,OffScreen;
Thread newThread; //新线程
Graphics drawOffScreen;
MediaTracker MT;
ImageProducer Source; //连续图像来源
CropImageFilter CutImage; //用来剪裁图像
public void init()
{
MT = new MediaTracker(this);
Animation = new Image[8]; //8张图像
currentImage = 0; //目前图像为第一张
AppletWidth = getSize().width; //Applet的宽度
AppletHeight = getSize().height; //Applet的高度
//次画面及绘制工具
OffScreen = createImage(AppletWidth,AppletHeight);
drawOffScreen = OffScreen.getGraphics();
//获得连续图像
SerialImage = getImage(getDocumentBase(),"Images/serial.gif");
MT.addImage(SerialImage,0);
try
{
showStatus("图像加载中..."); //在状态列显示信息
MT.waitForAll();
}
catch(InterruptedException E)
{
E.printStackTrace(); //打印错误信息
}
//剪裁连续图像
Source = SerialImage.getSource();
for(int i=0;i<8;i++)
{
CutImage = new CropImageFilter(i*250,0,250,250);
Animation[i]
= createImage(new FilteredImageSource(Source,CutImage));
drawOffScreen.drawImage(Animation[i],0,0,this);
}
}
public void start() //start()函数
{
newThread = new Thread(this); //建立与启动新线程
newThread.start();
}
public void stop() //stop()函数
{
newThread = null; //将线程设为null
}
public void paint(Graphics g)
{
//下面这行的作用为清除次画面
drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight);
//下面这行的作用为在次画面上绘制目前图像
drawOffScreen.drawImage(Animation[currentImage],0,0,this);
//将次画面贴到主画面上
g.drawImage(OffScreen,0,0,this);
}
public void update(Graphics g) //update()函数
{
paint(g); //只单纯调用paint()函数
}
public void run()
{
while(newThread != null) //动画循环
{
repaint(); //重新绘制图像
try
{
Thread.sleep(80); //暂停程序执行80毫秒
}
catch(InterruptedException E){ }
currentImage = (++currentImage) % 8; //指定目前图像
}
}
}
除了运行速度,我们还得考虑文件的大小。我们知道每种文件都有一定的格式,其中记录相应的文件信息,我们可以建立一个word文件,即使文件内容为空,文件的大小也不是0,同样的图片也是这样。往往游戏中要使用好多的图片,但就这些信息就会占据相当的空间。所以有时我们可以看好多的游戏为了节省空间,就将所有的图片包含在了一个文件中。
对于这样放置的一字排开的图片我们可以根据图片的大小。计算得到每张图片,并将其复制到一个图片数组中。这样就可以像前面的方法一样使用了。
1、//获得连续图像
SerialImage = getImage(getDocumentBase(),"Images/serial.gif");
2、//剪裁连续图像
Source = SerialImage.getSource();
for(int i=0;i<8;i++)
{
CutImage = new CropImageFilter(i*250,0,250,250);
Animation[i]
= createImage(new FilteredImageSource(Source,CutImage));
drawOffScreen.drawImage(Animation[i],0,0,this);
}