Actionscript 3.0基礎教程1-類的編寫

作者: egoldy

性質: 原創

閱讀次數: 27130

發表時間: 2007-02-20 06:23:21


     此教程是在上一篇探索Actionscript3.0 flash9 Preview教程的基礎上寫的.如果你還沒有讀過探索Actionscript3.0 flash9 Preview,請先讀上一篇教程之后,在讀此教程,在此教程中,我們根據上一篇教程中的例子,來研究編寫的類的各種方式,以適應一些不同的情況.



在上一篇教程中,我們已經了解到了在flash 9中如可在時間線上編寫代碼,如何將現有的時間線上的代碼轉換為外部類.以及flash9的Document Class形式,接下來我們要更細一步的來研究編寫類及外部as文件的方式.

include

如果你之前了解As1.0,As2.0編程,那么對include一定不陌生,在Actionscript 3.0中我們仍可以使用include 來導入代碼.
如下的例子:

1.打開flash新建一個文檔,保存為drag_inclue.fla在場景中創建一個movieclip,本例中使用的圓球,將其轉換為影片剪輯,并在場景中將其命名為circle_mc. 不需要在庫中設置鏈接屬性.
2.新增一層,按下F9打開Actionscript面板,在其中輸入代碼如下:

//設置當光標移到circle_mc上時顯示手形
circle_mc.buttonMode = true;
// 偵聽事件
circle_mc.addEventListener(MouseEvent.CLICK,onClick);
circle_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
circle_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
//定義onClick事件
function onClick(event:MouseEvent):void{
    trace("circle clicked");
}
//定義onDown事件
function onDown(event:MouseEvent):void{
    circle_mc.startDrag();
}

function onUp(event:MouseEvent):void{
    circle_mc.stopDrag();
} 

3.將此幀上的代碼全部選中,按下ctrl+x剪切掉,選擇flash的new菜單,新建一個Actionscript文件,在剛剪切掉的代碼貼上.保存名為drag_include.as.與drag_include.fla在同一路徑下.
4.回到drag_include.fla中,在第一幀上輸入如下代碼:
include "drag_include.as"
測試影片即可以看到與時間線上測試時相同的結果了.此種方式,在As1.0時經常使用.如果你仍習慣這種方式,在Actionscript 3.0中仍可以使用.

元件類(symbol class)

     這里所說的元件件類,實際是指為flash影片中的元件指定一個鏈接類名.它與上面的include 的不同之處于,它使用的是嚴格的類結構.而不是我們習慣上的時間線編寫方式.我們要將小圓球的拖動功能封裝起來,這樣不論你創建多少可以拖動的小球,都會 變得很輕松,只需要創建它的實例并顯示出來即可。
我們仍使用上例來說明問題.打開drag_include.fla文件,將其另存為Symbol_class.fla文件,新建一個 Actionscript文件,將其保存為Symbol_class.as文件,與Symbol_class.fla文件在相同目錄下。現在我們將上面的 例子中的代碼抽象成類如下:

package {
    
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    public class Symbol_class extends MovieClip {
        public function Symbol_class(){
            
            this.buttonMode = true;
            this.addEventListener(MouseEvent.CLICK,onClick);
            this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            this.addEventListener(MouseEvent.MOUSE_UP,onUp);
            
        }
        private function onClick(event:MouseEvent):void{
            trace("circle clicked");
        }
        private function onDown(event:MouseEvent):void{
            this.startDrag();
        }
        private function onUp(event:MouseEvent):void{
            this.stopDrag();
        }
    }
} 

因為我們將類的名稱設置為Symbol_class,所以此類文件一定要保存為Symbol_class.as文件.我們還要做一步工作,在源文件中打開 庫面板,右擊circle_mc選擇鏈接,復選Export for Actionscript.在class處輸入Symbol_class.as即讓我們類與元件相關連..此時測試影片,你會看到與上例中相同的結果.這 里注意一點,場景中仍要保證circle_mc的存在.因為在代碼中我們并沒有動態的貼加circle_mc. 同時這個例子中,與上例一樣,我們并沒有 使用As3.0的Document Class特性.

動態類(dynamic class)

      此種編寫的類的方式與探索Actionscript3.0 flash9 Preview教程中的例子是一樣的,此種方式是最最常用的.對于一些稍復雜的程序來說,是由主類和多個輔助類組成的.輔助類封裝分割開的功能,主類用來 顯示和集成各部分功能。如上例我們已經封裝了小球的拖動功能。現在我們想要創建100個這樣可以拖動的小球。
如下演示:

思路是我們已經創建了封裝了拖動功能的類,我們在創建一個主類,用來顯示這100個具有拖動功能的小球,我們將使用As3.0的DocumnetClass 新特性.
如下:我們將主類命名為DocumentClass.as, 封裝后的拖動球功能我們命名為Drag_class.as.
DocumentClass.as

package {
    
    import flash.display.MovieClip;
    
    public class DocumentClass extends MovieClip {
        
        // 屬性
        private var _circle:Drag_circle;
        private var _wslink:wslink;
        private const maxBalls:int = 100;
        // 構造函數
        public function DocumentClass(){
            var i:int;
            // 循環創建小球
            for(i=0;i<=maxBalls; i++){
                // 創建可拖動小球的實例
                _circle = new Drag_circle();
                // 設置小球實例的一些屬性
                _circle.scaleY = _circle.scaleX = Math.random();
                // 場景中的x,y位置
                _circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
                _circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
                // 在場景上顯示
                addChild(_circle);
            }
        }
        
    }
} 

Drag_circle.as類

package {
    
    import flash.display.Sprite;    
    import flash.events.MouseEvent;
            
    public class Drag_circle extends Sprite {
        
        public function Drag_circle(){
            
            this.buttonMode = true;
            this.addEventListener(MouseEvent.CLICK,onClick);
            this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            this.addEventListener(MouseEvent.MOUSE_UP,onUp);
                        
        }
            private function onClick(event:MouseEvent):void{
            trace("circle clicked");
        }

        private function onDown(event:MouseEvent):void{
            this.startDrag();
        }

        private function onUp(event:MouseEvent):void{
            this.stopDrag();
        }
                
    }
} 

打開我們之前所用過的fla文件,將其另存為drag_class.fla文件,與Document.as和Drag_class.as類所在目錄相同。 打開庫面板,選中庫面板中的小球,右擊選擇鏈接在class名稱處輸入Drag_class.注意與上面的元件類不同在于,我們不需要讓場景中有任何內 容,因為我們已在主類DocumentClass.as中動態的貼加和顯示了circle_mc.。在DocumentClass.fla中的主場景中, 在屬性面板中的Document Class輸入框中輸入我們的主類名DocumentClass.然后你就可以測試了。

不使用庫元件的動態類(dynamic class with no library)

      在上例中我們使用的是已創建好的影片剪輯,并在庫中做了類的鏈接,這種情況對于一些有復雜圖形的情況下是比較好的選擇,如果你能很熟 練的應用Drawing Api繪制出你想要的任意圖形,那么你也可以不使用庫元件,可以直接在類中編寫,在本教程中我們主要研究的是這種方式,接下來我們看不使用庫元件如何編寫 類來實現上面的功能。
很顯然即然不使用庫中的元件,那么我們就需要在類中直接使用Drawing Api來直接繪制。如下,類的結構與動態類是相同的。我們需要在上例的基礎上做些改動
首先刪去fla中場景中的所有內容,包括庫中的內容。

DocumentClass.as類如下:

package {
    
    import flash.display.MovieClip;
    public class DocumentClass extends MovieClip {
        private var _circle:Drag_circle;
        private const maxBalls:int = 100;

        public function DocumentClass(){
            
            var i:int;
            
            for(i=0;i<=maxBalls; i++){
                
                _circle = new Drag_circle();
                
                _circle.scaleY = _circle.scaleX = Math.random();
                
                _circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
                _circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
                
                addChild(_circle);
            }
        }
    }
} 

Drag_circle.as類

package {
    
    import flash.display.Sprite;
    import flash.display.Shape;
    import flash.events.MouseEvent;

    public class Drag_circle extends Sprite {
        
        private var _circle:Sprite;
        
        public function Drag_circle(){
            
            _circle = new Sprite();
            _circle.graphics.beginFill(0xff0000);
            _circle.graphics.drawCircle(-5, -5, 10);
            _circle.graphics.endFill();
            _circle.buttonMode =true;
            addChild(_circle);
            
            
            _circle.addEventListener(MouseEvent.CLICK,onClick);
            _circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            _circle.addEventListener(MouseEvent.MOUSE_UP,onUp);
            
        }
        
        
        private function onClick(event:MouseEvent):void{
            trace("circle clicked");
        }

        private function onDown(event:MouseEvent):void{
            _circle.startDrag();
        }

        private function onUp(event:MouseEvent):void{
            _circle.stopDrag();
        }
    }
} 

注意Drag_circle.as類,我們只是增加了一段:

_circle = new Sprite();
_circle.graphics.beginFill(0xff0000);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill(); 

還有就是構造函數之前的聲明:private var _circle:Sprite;
測試你的影片。當然這里我們繪制的只是一個無漸變的紅色園形。

Package Class

一般來說,一個.as文件中就一個類,但是在AS3中,現在允許在一個文件中定義多個類用來輔助主類。
在.as文件中的輔助類,必須定義在類包以外,并且只針對此文件中的主類和其他輔助類可見。它的基本結構如下:

package {
    class MyClass {
        function MyClass() {
            var helper:MyHelper = new MyHelper();
        }
    }
}
class MyHelper {
    function MyHelper() {
        var helper:HelpersHelper = new HelpersHelper();
    }
}
class HelpersHelper {
    function HelpersHelper () {
    }
} 

注意,在包塊中最多只能定義一個類。在同一個文件中的輔助類不是包塊的一部分,并且只能在此文件中可見和被使用。

下面我們將我們將我們的類改寫成上述的packge類形式。我們將下面的代碼都寫在一個DocumentClass.as的文件中,然后在fla文件中的屬性面板中的Document Class輸入框中輸入DocumentClass類名。

package {
    
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    
    // Document Class
    public class DocumentClass extends MovieClip {
        
        private var _circle:Drag_circle;
        private const maxBalls:int = 100;
        
        public function DocumentClass(){
            var i:int;
            for(i=0;i<=maxBalls; i++){
                _circle = new Drag_circle();
                    
                _circle.scaleY = _circle.scaleX = Math.random();
                
                _circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
                _circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
                
                addChild(_circle);
            }
        }
    }
    
    public class Drag_circle extends Sprite {
        
        private var _circle:Sprite;
        
        public function Drag_circle(){
            
            _circle = new Sprite();
            _circle.graphics.beginFill(0x6D6E71);
            _circle.graphics.drawCircle(-5, -5, 10);
            _circle.graphics.endFill();
            
            addChild(_circle);
            
                        this.buttonMode = true;
            _circle.addEventListener(MouseEvent.CLICK,onClick);
            _circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
            _circle.addEventListener(MouseEvent.MOUSE_UP,onUp);
            
        }
        private function onClick(event:MouseEvent):void{
            trace("circle clicked");
        }

        private function onDown(event:MouseEvent):void{
            _circle.startDrag();
        }
        private function onUp(event:MouseEvent):void{
            _circle.stopDrag();
        }
    }
} 

現在就可以測試你的影片了。

By egoldy: 在此教程中我們只是研究類的編寫方式,了解了類的編寫方式,我們就可以在后面的編寫工作針對不同的情形進行類的編寫了。
 

討論此教程

源文件下載

服務項目_SERVICE

關于我們

萬博思圖(北京)信息技術有限公司,專業的flash,flex開發團隊,5年經驗。公司致力于互聯網上的業務的開展,對于互動網站行銷,互聯網應用程序開發有成熟的解決方案。我們關注互聯網市場動態,關注新技術,更注重在新的領域不斷探索發現。
萬博思圖業務內容主要包括企業品牌Flash網站開發,企業形象宣傳Flash設計,動畫,多媒體演示,Flex企業級應用程序開發,擁有眾多成功案例,歡迎來電咨詢。
 
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝陽區光華路15號院泰達時代中心4號樓704 郵編: 100026 EMAIL: [email protected]
電話: 010-59070059   (新號:010-59897050 010-59897060)  手機: 13693660520 傳真: 010-59070059-801
京公網安備:110108006741      京ICP備:05013074號-1
王先生
浙江6十1开奖结果规则 意甲联赛最新赛程安排 湖南快乐十分开奖视频走势图 海南体彩4 1规律图 刘伯温平特一肖 516棋牌游戏公众号 河南泳坛夺金规则 5分赛车稳定赚钱计划 新牛人配资 北京麻将小游戏单机版 黑龙江十一选五基本走势 江苏七位数基本走势图 招商证券理财平台 秒速赛车五码免费计划 金色旋风网赚论坛 微乐麻将登录不了 河南快三横屏版走势图连线