有了ShareObject 这个利器,我们可以实现比存档更为强大的功能--录像回放 (当然,是指能够保存下来的录像,ShareObject 本身只是用来存储数据的,录像的实现本身与ShareObject 无关)为此我做了一个简单的例子:
说明: 用户可以随意托动小球,点击record开始录像(状态栏显示为“录制”),此期间用户仍可随意托动小球,请记住自己托动过的路线,要结束录像请再点击record,(录像时间为60秒)超时自动结束录制。点击replay观看刚才的录像(在录制状态直接点击replay也可)再次点击replay结束重播。
一下是全部代码: frame 1: var isRecording=0; var isReplaying=0; var i=0; var j=0; var condition="无";
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="无"; //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="无"} } 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="无";} } else{j=0; isReplaying=0; condition="无";} } }
值得注意的是,上面这种储存录像的方法只适用于简单录像的存储,因为它实际上是用一种储存每时刻状态的方式,对上面的例子而言,小球的状态只有它的坐标,因此可以轻松的实现。
但是,对于比较复杂的动画,例如一个射击游戏,采取这样的方式是不现实的因为状态量十分之多,比如,我方战机的HP,得分,位置,敌方战机的位置甚至是双方发出的每一颗子弹的位置,都是状态量,记录如此之多的状态是极其复杂的也会占据大量的空间。因此,我想可以改以一种存储每时刻操作的方式,即:记录每一时刻用户对player的操作,例如鼠标点击,方向键的按下等等,这样,在回放的时候,将数组中弹出的操作指令作用于player之上。相当于是让计算机替用户操作,这种基于原游戏机制的方法可以节省大量的空间。例如,某一时刻用户的操作为“按下up键”和“按下空格键(开火)”,只要让player在重放过程中得到这两个指令,就可以向玩家手动控制一样,做出相应的前进和射击的反应。但是,这种方法有一个局限性,就是必须从头开始录制,因为每一个状态都是从前一状态中递推出来的。我现在只有这样一个想法,还没有来得及实现,希望大家能对此发表自己的看法。
出处:
责任编辑:蓝色
◎进入论坛Flash专栏版块参加讨论
|