(6)下面是元件類擴展類。該類有三個私有屬性,如第11到13行代碼所示,我們在第22、第25行代碼分別定義其屬性對應的get()方法,為該元件類實例提供可訪問對應屬性的接口,第三個屬性還提供set()方法,如第29行代碼所示。在該類構造函數中還初始化了三個屬性,分別產生隨機的newX、newY值,如第17到19行代碼所示。AS3代碼:
/** * 該類為擴展元件類 * @author lbynet * @version 0.1 */ package { import flash.display.Sprite; public class Ball_mc extends Sprite { private var newX:Number; private var newY:Number; private var W:Number; public function Ball_mc() { this.newX = 1 + Math.random()*100; //x軸上的隨機速度 this.newY = 1 + Math.random()*20; //y軸上的隨機速度 this.W = 0;//用于改變 x軸上的隨機速度 值 } public function get _newX():Number{ return this.newX; } public function get _newY():Number{ return this.newY; } public function set _W(i:Number){ this.W = i; } public function get _W():Number{ return this.W; } } } |
(7) 下面的Main類是本實例的文檔類,該類定義了三個屬性,分別是存儲水泡總數、數量累加變量和隨機寬、高比例值, 第12到14行代碼所示。在構造函數中調用init()方法進行初始化兩個屬性值,并注冊ENTER_FRAME 事件偵聽器,如第20到22行代碼所示。
/** * 該類為主程序類 * @author lbynet * @version 0.1 */ package { import flash.display.Sprite; import flash.events.Event; public class Main extends Sprite { private var totalNum:uint; private var i:uint; private var dim:Number; public function Main() { init(); } private function init() { this.totalNum = 70; this.i = 0; stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler); } |
(8)下面是兩個偵聽器函數,enterFrameHandler是前面注冊的偵聽器對應的函數,該函數創建了totalNum+1個Ball_mc實例,并實例的y坐標值統一設置在舞臺高度之外,如第29到31行代碼所示。接著我們在第33行代碼中隨機生成一個0到1之間的隨機小數,并與生成的Ball_mc實例對應的寬、高進行相乘得到隨機的寬、高值,如第33到35行代碼所示。If()語句的最后將Ball_mc實例添加到顯示列表并注冊ENTER_FRAME 事件偵聽器,和進行i值的累加,如第37到39行代碼所示。
AS3代碼
private function enterFrameHandler(event:Event) { var _mc:Sprite; if (this.i <= totalNum) { _mc = new Ball_mc(); _mc.y = stage.stageHeight; this.dim = Math.random(); _mc.width *= dim; _mc.height *= dim; addChild(_mc); _mc.addEventListener(Event.ENTER_FRAME, removeEnterFrameHandler); this.i++; } } private function removeEnterFrameHandler(event:Event) { var _mc:* = event.target as Sprite; _mc._W += .1; _mc.x = Math.sin(_mc._W)*_mc._newX + stage.stageWidth/2; _mc.y -= _mc._newY; if (_mc.y <= 0) { _mc.removeEventListener(Event.ENTER_FRAME, removeEnterFrameHandler); removeChild(_mc); this.i--; //使得i的值小于totalNum,從而重新創建water_mc } } } |
(9)removeEnterFrameHandler是生成的每個Ball_mc實例對應的偵聽器函數,在該函數中,我們對Ball_mc實例的W屬性進行累加,并設置其X、Y坐標值,如上圖中第45到48行代碼所示,其中X坐標值被設置為舞臺中間大小 + 對應Ball_mc實例的newX屬性值 * 其W屬性的正弦值,如上圖中第47行代碼所示,從而使對應Ball_mc實例在舞臺中間的左右來回作運動,而在Y軸方向上賦予其newY值,使其產生Y軸方向上的遞減(也就是Ball_mc實例向上運動),如上圖中第48行代碼所示,最終產生盤旋上升效果,如本例效果圖所示。下圖所示是本例所使用的三角函數簡單原理圖。
圖10-6 三角函數原理
(10) 當Ball_mc實例運動致舞臺上方外,便清除該實例注冊的ENTER_FRAME 事件偵聽器和該該實例,并進行i值的遞減,如步驟(7)第50到55行代碼所示。我們還可以擴展思路,創作更多效果,如下圖所示的小球從向而上運動,作類似噴泉效果。還可以做各種類似冒泡效果。
圖10-7 擴展實例
進入論壇參與討論和交作業:http://www.missyuan.com/viewthread.php?tid=424460