動畫方面.
前面的朋友說了動畫的制作,一個動畫是由很多幀組在的.,您說的方法把一幀幀的動畫做成一幅幅的圖象,再一幅幅地載入,這樣做的效率不高.應該把各幅員的動畫放在一起,做成一幅大的圖,加載一幅大圖比加載多幅小圖效率要高,一幅大圖也比多幅小圖容易管理得多.那么怎樣做呢?
做法和前面朋友說的差不多,關鍵是這個方法:
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帖都做不到.