动画方面.
前面的朋友说了动画的制作,一个动画是由很多帧组在的.,您说的方法把一帧帧的动画做成一幅幅的图象,再一幅幅地载入,这样做的效率不高.应该把各幅员的动画放在一起,做成一幅大的图,加载一幅大图比加载多幅小图效率要高,一幅大图也比多幅小图容易管理得多.那么怎样做呢?
做法和前面朋友说的差不多,关键是这个方法:
drawImage(Image img,dx1,dy1,dx2,dy2,sx1,sy1,sx1,sy1,this)
其中Image img是来源图象,
dx1是目的区域的===左上===顶点的===X====坐标;
dy1是目的区域的===左上===顶点的===Y====坐标;
dx2是目的区域的===右下===顶点的===X====坐标;
dy2是目的区域的===右下===顶点的===Y====坐标;
sx1是来源区域的===左上===顶点的===X====坐标;
sy1是来源区域的===左上===顶点的===Y====坐标;
sx2是来源区域的===右下===顶点的===X====坐标;
sy2是来源区域的===右下===顶点的===Y====坐标.
================================================================
下面是一个动画的程序代码.
import java.awt.*;
import java.applet.*;
public class Seriallmage4 extends Applet implements Runnable
{
int SPF; //用来表示线程暂停的时间
int sx,sy;
/******************************************************************
sx,sy用来表示来源区域的左上顶点.因为每一帧我们都做成了长是80宽87的图,再把它们放在一起做成一幅大的图,
所以来源区域的右下顶点的坐标等于左上顶点坐标加上长和高.
式子为:sx+80;sy+87
******************************************************************/
Image Animation; //来源图象
MediaTracker MT; //图像追踪器,用来检查图像是否完全加载
Thread newThread; //新的线程.
Image OffScreen; //后台图像;
Graphics drawOffScreen; //绘制后台图像的实体(实例).
//======================init()函数===========================
public void init()
{
SPF=100; //线程暂停的时间是100豪秒,
MT=new MediaTracker(this); //实体化图像追踪器.
Animation=getImage(getDocumentBase(),"lunisEx.gif");//加载图像.
//======================//追踪图像=============================
MT.addImage(Animation,0);
try
{
showStatus("图象加载中...."); //在状态栏中显示信息
MT.waitForAll(); //等待加载
}
catch(InterruptedException E){}
//============================================================
OffScreen=createImage(300,300); //建立后台画面的实体
drawOffScreen=OffScreen.getGraphics(); //取得后台画面的绘制类
}
//===========================================================
public void start() //start函数
{
newThread=new Thread(this); //建立线程
newThread.start(); //启动线程
}
public void stop() //stop函数
{
newThread=null; //线程设为null
}
//==========================================================
public void paint(Graphics g)
{
drawOffScreen.setColor(Color.green); //设置后台画面的背景色,
drawOffScreen.fillRect(0,0,300,300); //画一次背景,作用是清除后台画面,如果背景是一幅画
//则要用这幅图来画.
drawOffScreen.drawImage(Animation,20,20,250,250,sx,sy,sx+80,sy+87,this);//在后台画面绘制
//的图像,
g.drawImage(OffScreen,0,0,300,300,this);//把后台画面画到前台画面
}
public void update(Graphics g)
{
paint(g);
}
//====================新动画循环在此========================50
public void run()
{
while(newThread !=null) //如果线程不等于null
{
repaint(); // 重画一次.
try
{
Thread.sleep(SPF); //让线程暂停
sx+=80; //画了一次后,改变来源区域,使其到下一帧.
if(sx==800) //我的图像是一幅800*170的,有两行,每行十帧,如果sx走到了
//800就说明播放完第一行了,
{
sy+=85; //播放完第一行后,改变来源区域的左上顶点使其跑到第二行.
sx=0;
if(sy==170) //如果播放完第二行后,又让它回到第一行,
{
sy=0;
}
}
}
catch(InterruptedException E){}
}
}
}
动画每秒播放多少帧好呢?
电影的是每秒24帧,这样的速度不仅能产生视觉停留,而且让人感觉到画面非常流畅.那么是不是我们做游戏也要用这个速度呢?答案是否定的,实际上每秒播放10帧就足已产生视觉停留,如果设置高了会消耗更多的资源.至命的是,有一些手机连每秒10帖都做不到.