1. 程式人生 > >as3結構學習筆記 ENTER FRAME 監聽的函式

as3結構學習筆記 ENTER FRAME 監聽的函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

            做動畫的時候,特別是寫As3的動畫,很多時候主要都是需要通過監聽ENTER_FREAME或者Timer來完成動畫播放。在監聽其中一個事件之後,我們通常會在回撥的時候進行添加里面的行為動作完成我們的期望。

        

import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為 }


    

       你是否有想過這個函式可以怎樣寫?裡面的可以怎樣變化嗎?應該怎樣管理裡面行為?

      在一個系統裡面,特別ENTER_FRAME裡面的管理顯得尤為重要。我們整個系統只需要一個監聽事件 來完成我們的行為。這樣一來裡面的行為會顯得高度集中和抽象,這是因為系統裡面有很多模組,都要經過這裡來處理。當然也可以在不同的模組都監聽ENTER_FRAME 這個事件,完成我們的事情,但我們並不提倡這種做法。

       (1)全域性只有一個監聽ENTER_FRAME事件的回撥函式。

       (2)全域性有多個監聽ENTER_FRAME事件的回撥函式。 

 

    我們個寫個簡單的例子。

   第一個例子,讓一個mc向右移動,速度是2

  import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為 mc.x+=2;}


 現在我們改造一下,讓其也可以達到我們的目的

 

import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為 move();}function move():void{ mc.x+=2; }


我們把mc.x+=2 抽出來變成了一個函式,然後把這個函式放在Enter_Frame 裡面執行。這種抽出來只是我們開始第一步。

 

假設,我們場景上有兩個Mc,兩個Mc都要進行移動,一個向左移動 一個向右移動,我們迴歸到第一種寫法

import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為   mc.x+=2; mc2.x-=2; }


第二種寫法:

import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為    move();  move2(); }function move():void{ mc.x+=2; }function move2():void{ mc2.x-=2; }


如果,多個MC執行行為不一樣,那麼我們採用第二種方式會變成下面的情況。有N個Mc,於是有N個執行的函式。

import flash.events.Event;stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為    move();  move2();   move3();  move4();  .......}


假設這種方式成立,我們增加一個行為,就在裡面新增多一個行程式碼執行就可以完成Mc的移動。不過在這第二種方式下,我們的程式碼可能變得很長。於是我們需要藉助

一個數組來儲存的函式。

 

接下來,我們為每一個行為都新增一個key。接下來我們可以這樣改造

import flash.events.Event;import flash.utils.Dictionary;var funData:Dictionary=new Dictionary();stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為    for each(var fun:Function in funData)  {   try   {     fun.call();   }catch(e:Error)   {    throw new Error(e.getStackTrace());   }  }  }funData["key1"]=move;funData["key2"]=move2;function move():void{ mc.x+=2; }function move2():void{ mc2.x-=2; }


 

這種方式 改進了我們之前的做法,我們採用一種管理的想法去管理我們的函式。在Enter_Frame 執行的時候,採用迴圈的方式來響應我們的函式行為。

 

import flash.events.Event;import flash.utils.Dictionary;var funData:Dictionary=new Dictionary();stage.addEventListener(Event.ENTER_FRAME,onUpdate);function onUpdate(event:Event):void{ //新增行為    for each(var fun:Function in funData)  {   try   {     fun.call();   }catch(e:Error)   {    throw new Error(e.getStackTrace());   }  }  }addFun("key",move);addFun("key2",move2);function addFun(key:Object,fun:Function):void{ if(!funData.hasOwnProperty(key)) {  funData[key]=fun; }}function removeFun(key:Object):void{ if(funData.hasOwnProperty(key)) {  delete funData[key];  funData[key]=null; }}function move():void{ mc.x+=2; }function move2():void{ mc2.x-=2; }


 

注意一點。如果我們採用的for each的做法會導致一個問題,for each 執行迴圈的時候,是不確定的,這就意味先後順序執行的方式會有不確定的因素存在。 如果陣列儲存的行為很多,那麼執行順序就會有先後。而for each的迴圈方式並不是根據我們新增先後來安排他的執行順序。

 

這種方式的管理,可以在不同的模組進行監聽。而全域性只是需要一個Enter_Frame 即可。我們只是需要添加里面行為到裡面執行。

 

  而有一個問題是,funData 移除了不需要執行的函式,那麼for each 裡面是否依舊會遍歷?這個問題,我還沒去實踐過,不知道還不會執行多次呢?

 

 

 

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述