動(dòng)畫(huà)方面.
前面的朋友說(shuō)了動(dòng)畫(huà)的制作,一個(gè)動(dòng)畫(huà)是由很多幀組在的.,您說(shuō)的方法把一幀幀的動(dòng)畫(huà)做成一幅幅的圖象,再一幅幅地載入,這樣做的效率不高.應(yīng)該把各幅員的動(dòng)畫(huà)放在一起,做成一幅大的圖,加載一幅大圖比加載多幅小圖效率要高,一幅大圖也比多幅小圖容易管理得多.那么怎樣做呢?
做法和前面朋友說(shuō)的差不多,關(guān)鍵是這個(gè)方法:
drawImage(Image img,dx1,dy1,dx2,dy2,sx1,sy1,sx1,sy1,this)
其中Image img是來(lái)源圖象,
dx1是目的區(qū)域的===左上===頂點(diǎn)的===X====坐標(biāo);
dy1是目的區(qū)域的===左上===頂點(diǎn)的===Y====坐標(biāo);
dx2是目的區(qū)域的===右下===頂點(diǎn)的===X====坐標(biāo);
dy2是目的區(qū)域的===右下===頂點(diǎn)的===Y====坐標(biāo);
sx1是來(lái)源區(qū)域的===左上===頂點(diǎn)的===X====坐標(biāo);
sy1是來(lái)源區(qū)域的===左上===頂點(diǎn)的===Y====坐標(biāo);
sx2是來(lái)源區(qū)域的===右下===頂點(diǎn)的===X====坐標(biāo);
sy2是來(lái)源區(qū)域的===右下===頂點(diǎn)的===Y====坐標(biāo).
================================================================
下面是一個(gè)動(dòng)畫(huà)的程序代碼.
import java.awt.*;
import java.applet.*;
public class Seriallmage4 extends Applet implements Runnable
{
int SPF; //用來(lái)表示線程暫停的時(shí)間
int sx,sy;
/******************************************************************
sx,sy用來(lái)表示來(lái)源區(qū)域的左上頂點(diǎn).因?yàn)槊恳粠覀兌甲龀闪碎L(zhǎng)是80寬87的圖,再把它們放在一起做成一幅大的圖,
所以來(lái)源區(qū)域的右下頂點(diǎn)的坐標(biāo)等于左上頂點(diǎn)坐標(biāo)加上長(zhǎng)和高.
式子為:sx+80;sy+87
******************************************************************/
Image Animation; //來(lái)源圖象
MediaTracker MT; //圖像追蹤器,用來(lái)檢查圖像是否完全加載
Thread newThread; //新的線程.
Image OffScreen; //后臺(tái)圖像;
Graphics drawOffScreen; //繪制后臺(tái)圖像的實(shí)體(實(shí)例).
//======================init()函數(shù)===========================
public void init()
{
SPF=100; //線程暫停的時(shí)間是100豪秒,
MT=new MediaTracker(this); //實(shí)體化圖像追蹤器.
Animation=getImage(getDocumentBase(),"lunisEx.gif");//加載圖像.
//======================//追蹤圖像=============================
MT.addImage(Animation,0);
try
{
showStatus("圖象加載中...."); //在狀態(tài)欄中顯示信息
MT.waitForAll(); //等待加載
}
catch(InterruptedException E){}
//============================================================
OffScreen=createImage(300,300); //建立后臺(tái)畫(huà)面的實(shí)體
drawOffScreen=OffScreen.getGraphics(); //取得后臺(tái)畫(huà)面的繪制類(lèi)
}
//===========================================================
public void start() //start函數(shù)
{
newThread=new Thread(this); //建立線程
newThread.start(); //啟動(dòng)線程
}
public void stop() //stop函數(shù)
{
newThread=null; //線程設(shè)為null
}
//==========================================================
public void paint(Graphics g)
{
drawOffScreen.setColor(Color.green); //設(shè)置后臺(tái)畫(huà)面的背景色,
drawOffScreen.fillRect(0,0,300,300); //畫(huà)一次背景,作用是清除后臺(tái)畫(huà)面,如果背景是一幅畫(huà)
//則要用這幅圖來(lái)畫(huà).
drawOffScreen.drawImage(Animation,20,20,250,250,sx,sy,sx+80,sy+87,this);//在后臺(tái)畫(huà)面繪制
//的圖像,
g.drawImage(OffScreen,0,0,300,300,this);//把后臺(tái)畫(huà)面畫(huà)到前臺(tái)畫(huà)面
}
public void update(Graphics g)
{
paint(g);
}
//====================新動(dòng)畫(huà)循環(huán)在此========================50
public void run()
{
while(newThread !=null) //如果線程不等于null
{
repaint(); // 重畫(huà)一次.
try
{
Thread.sleep(SPF); //讓線程暫停
sx+=80; //畫(huà)了一次后,改變來(lái)源區(qū)域,使其到下一幀.
if(sx==800) //我的圖像是一幅800*170的,有兩行,每行十幀,如果sx走到了
//800就說(shuō)明播放完第一行了,
{
sy+=85; //播放完第一行后,改變來(lái)源區(qū)域的左上頂點(diǎn)使其跑到第二行.
sx=0;
if(sy==170) //如果播放完第二行后,又讓它回到第一行,
{
sy=0;
}
}
}
catch(InterruptedException E){}
}
}
}
動(dòng)畫(huà)每秒播放多少幀好呢?
電影的是每秒24幀,這樣的速度不僅能產(chǎn)生視覺(jué)停留,而且讓人感覺(jué)到畫(huà)面非常流暢.那么是不是我們做游戲也要用這個(gè)速度呢?答案是否定的,實(shí)際上每秒播放10幀就足已產(chǎn)生視覺(jué)停留,如果設(shè)置高了會(huì)消耗更多的資源.至命的是,有一些手機(jī)連每秒10帖都做不到.