有了ShareObject 這個(gè)利器,我們可以實(shí)現(xiàn)比存檔更為強(qiáng)大的功能--錄像回放 (當(dāng)然,是指能夠保存下來(lái)的錄像,ShareObject 本身只是用來(lái)存儲(chǔ)數(shù)據(jù)的,錄像的實(shí)現(xiàn)本身與ShareObject 無(wú)關(guān))為此我做了一個(gè)簡(jiǎn)單的例子:
說(shuō)明: 用戶可以隨意托動(dòng)小球,點(diǎn)擊record開始錄像(狀態(tài)欄顯示為“錄制”),此期間用戶仍可隨意托動(dòng)小球,請(qǐng)記住自己托動(dòng)過(guò)的路線,要結(jié)束錄像請(qǐng)?jiān)冱c(diǎn)擊record,(錄像時(shí)間為60秒)超時(shí)自動(dòng)結(jié)束錄制。點(diǎn)擊replay觀看剛才的錄像(在錄制狀態(tài)直接點(diǎn)擊replay也可)再次點(diǎn)擊replay結(jié)束重播。
一下是全部代碼: frame 1: var isRecording=0; var isReplaying=0; var i=0; var j=0; var condition="無(wú)";
myLSO=SharedObject.getLocal("record_1");
if(myLSO.data.statu == undefined) { statu=new Array(); myLSO.data.statu=statu; }
player.onPress=function() { if(!isReplaying) this.startDrag(true); } player.onRelease=function() { if(!isReplaying) stopDrag(); } function Record() { isRecording=!isRecording; isReplaying=0; if(i!=0) for(;i<=1200;i++) { myLSO.data.statu[i]=undefined; myLSO.data.statu[i+1]=undefined; } i=0; if(!isRecording) condition="無(wú)"; //trace(isRecording); } function Replay() { isReplaying=!isReplaying; isRecording=0; j=0; if(i!=0) for(;i<=1200;i++) { myLSO.data.statu[i]=undefined; myLSO.data.statu[i+1]=undefined; } i=0; //trace(isReplaying); } _root.onEnterFrame=function() { if(isRecording) { condition="錄制"; myLSO.data.statu[i]=player._x; myLSO.data.statu[i+1]=player._y; i+=2; if(i>=1200) {i=0; isRecording=0; condition="無(wú)"} } if(isReplaying) { condition="重放"; if(myLSO.data.statu[j]!=undefined) { player._x=myLSO.data.statu[j]; player._y=myLSO.data.statu[j+1]; j+=2; if(j>=1200) {j=0; isReplaying=0; condition="無(wú)";} } else{j=0; isReplaying=0; condition="無(wú)";} } }
值得注意的是,上面這種儲(chǔ)存錄像的方法只適用于簡(jiǎn)單錄像的存儲(chǔ),因?yàn)樗鼘?shí)際上是用一種儲(chǔ)存每時(shí)刻狀態(tài)的方式,對(duì)上面的例子而言,小球的狀態(tài)只有它的坐標(biāo),因此可以輕松的實(shí)現(xiàn)。
但是,對(duì)于比較復(fù)雜的動(dòng)畫,例如一個(gè)射擊游戲,采取這樣的方式是不現(xiàn)實(shí)的因?yàn)闋顟B(tài)量十分之多,比如,我方戰(zhàn)機(jī)的HP,得分,位置,敵方戰(zhàn)機(jī)的位置甚至是雙方發(fā)出的每一顆子彈的位置,都是狀態(tài)量,記錄如此之多的狀態(tài)是極其復(fù)雜的也會(huì)占據(jù)大量的空間。因此,我想可以改以一種存儲(chǔ)每時(shí)刻操作的方式,即:記錄每一時(shí)刻用戶對(duì)player的操作,例如鼠標(biāo)點(diǎn)擊,方向鍵的按下等等,這樣,在回放的時(shí)候,將數(shù)組中彈出的操作指令作用于player之上。相當(dāng)于是讓計(jì)算機(jī)替用戶操作,這種基于原游戲機(jī)制的方法可以節(jié)省大量的空間。例如,某一時(shí)刻用戶的操作為“按下up鍵”和“按下空格鍵(開火)”,只要讓player在重放過(guò)程中得到這兩個(gè)指令,就可以向玩家手動(dòng)控制一樣,做出相應(yīng)的前進(jìn)和射擊的反應(yīng)。但是,這種方法有一個(gè)局限性,就是必須從頭開始錄制,因?yàn)槊恳粋(gè)狀態(tài)都是從前一狀態(tài)中遞推出來(lái)的。我現(xiàn)在只有這樣一個(gè)想法,還沒(méi)有來(lái)得及實(shí)現(xiàn),希望大家能對(duì)此發(fā)表自己的看法。
出處:
責(zé)任編輯:藍(lán)色
◎進(jìn)入論壇Flash專欄版塊參加討論
|