2012-07-25 24 views
0

我在我的庫中有一個叫做blueBox的movieClip,它有一個相應的類blueBox.as,它包含blueBox()構造函數,一些變量和一個處理MOUSE_DOWN事件的函數。我還有一個名爲redBox的movieClip,它需要與blueBox.as幾乎相同的類。是否可以複製blueBox.as,只需更改構造函數的名稱和變量的值,而無需手動將其保存爲redBox.as?現在手動做這個問題並不是一個大問題,但是隨着這個項目的增長,它將創建無意義數量的文件,所有這些文件都包含相同的信息,並且這看起來有點多餘,任何洞察力都是值得歡迎的。複製類AS3

+0

你不能改變構造的名稱。準確描述你想要做什麼。看來你做錯了什麼。 – eleven 2012-07-25 14:29:30

回答

0

好像你只是需要一個Box類,可以顯示不同類型的電影剪輯。一旦你有了這個課程,你可以創建多個實例,每個實例都有不同的動畫片段(紅框,藍框​​等)。

+0

這聽起來像個好主意,但是如果我不能有多個外部可見的文件定義,也不能將兩個movieCLip鏈接到同一個類,我該如何做到這一點? – Oddysen 2012-07-25 15:01:42

+0

我假設你正在使用Flash Professional要做到這一點,我不使用它,所以我的知識是有限的,但你應該能夠出口您的資產(紅盒子,BLUEBOX)影片剪輯中的SWF,然後寫一個單獨的AS3類使用這些。 – 2012-07-25 15:03:34

+0

我似乎無法弄清楚這將如何完成,對不起。我想我被困在一些事情中,老實說,沒有什麼大問題,我只是覺得有幾個相同的文件有點多餘,但似乎不一致。 – Oddysen 2012-07-25 15:17:02

0

你可以通過使用inheritance來解決這個問題 - 一個從MovieClip類擴展而來的概念。當你從一個類繼承時,你借用它的實現,你可以添加更多的特定功能,甚至可以重寫一個超類的實現。

讓我們看一個人爲的例子:

鑑於有一個類,看起來是這樣的:

public class BlueBox extends MovieClip { 

    private var color:uint; 

    public function BlueBox() { 
     this.color = 0x0000FF; 
     this.addEventListener(MosueEvent.MOUSE_DOWN, handler) 

     redraw(); 
    } 

    // Mouse handler 
    private function handler(e:MouseEvent):void { 
     trace("DOWN!"); 
    } 

    // some internal work 
    private funciton redraw() { 
     this.graphics.clear(); 
     this.graphics.beginFill(this.color); 
     this.graphics.drawRect(10,10,50,50); 
    } 

    // other methods. 
} 

而且要進行一個非常類似的RedBox類改變color0xFF0000

所以現在,BlueBoxMovieClip繼承其功能。這意味着它是一個更「特定」的子類型。 MovieClip本身繼承自Sprite,借用該類的一些作品並自行擴展。

事實上,有繼承了MovieClip整個層次結構:

MovieClip -> Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object 

你可以看到最基本的類型是Object,這幾乎所有的東西都是在ActionScript。 「幾乎」是這句話的關鍵詞。

可能最簡單的方法是創建父類或基類,BlueBoxRedBox都將從中繼承。這個新的父代將保存它們之間通用的代碼,那麼RedBoxBlueBox將只包含它們之間不同的代碼。

例如,讓我們看看新的基類:

public class AbstractBox extends MovieClip { 

    private var color:uint; 

    public function AbstractBox(color:uint) { 
     this.color = color; 
     this.addEventListener(MosueEvent.MOUSE_DOWN, handler) 
     redraw(); 
    } 

    // Mouse handler 
    private function handler(e:MouseEvent):void { 
     trace("DOWN!"); 
    } 

    // some internal work 
    private funciton redraw() { 
     this.graphics.clear(); 
     this.graphics.beginFill(this.color); 
     this.graphics.drawRect(10,10,50,50); 
    } 

    // other methods. 
} 

聲明本類AbstractBox包含大部分相同的東西,之前:這從MovieClip繼承,它具有handlerredraw功能。真正唯一的區別是它的構造函數接受一個參數 - 它將用於在redraw中繪製矩形的顏色。

那麼我們可以從BlueBox中刪除什麼?幾乎一切,讓我們來看看:

public class BlueBox extends AbstractBox { 
    public function BlueBox(color:uint) { 
     super(0x0000ff) 
    } 
} 

注意BlueBox現在擴展AbstractBox,其大部分的實施已被刪除 - 或者更具體地從它的超借來的。在構造函數中,我們調用我們的「父類」類構造函數,並賦予它應該使用的顏色。

現在做RedBox,我們所要做的就是改變顏色:

public class RedBox extends AbstractBox { 
    public function BlueBox(color:uint) { 
     super(0xff0000) 
    } 
} 

你去那裏。這兩個通用的代碼都生活在AbstractBox,然後RedBoxBlueBox只是該共同祖先的具體實現。

當談到OOP時,這幾乎只是冰山一角,還有很多東西需要學習,也許更重要的是,學習而不是使用繼承來解決問題。但幸運的是,爲了獲得這些技能,互聯網上有很多資源。


基於關閉您的評論,你可以只要嘗試另一種方法,因爲你是從動作instatating這些的DisplayObject - 而不是從Flash用戶界面 - 是使用靜態方法,而不是子類產生這些

public class AbstractBox extends MovieClip { 

    public static function createBlueBox():AbstractBox 
    { 
     return new AbstractBox(0x0000FF); 
    } 

    public static function createRedBox():AbstractBox 
    { 
     return new AbstractBox(0xFF0000); 
    } 

    private var color:uint; 

    public function AbstractBox(color:uint) { 
     this.color = color; 
     this.addEventListener(MosueEvent.MOUSE_DOWN, handler) 
     redraw(); 
    } 

    // Mouse handler 
    private function handler(e:MouseEvent):void { 
     trace("DOWN!"); 
    } 

    // some internal work 
    private funciton redraw() { 
     this.graphics.clear(); 
     this.graphics.beginFill(this.color); 
     this.graphics.drawRect(10,10,50,50); 
    } 

    // other methods. 
} 

,然後使用調用它們:

var blue:AbstractBox = AbstractBox.createBlueBox(); 
var red:AbstractBox = AbstractBox.createRedBox(); 

Flash用戶界面需要在您重新的類繼承鏈和參數的構造函數所以如果你以這種方式鏈接你的剪輯,那麼你必須生成兒童課程。或者完全改變範例,而不是依賴構造函數來設置/更改有問題的屬性,但是一旦屬性被設置,剪輯就會重繪自己。喜歡的東西:

public class AbstractBox extends MovieClip { 

    private var _color:uint; 

    public function get color():uint { return _color; } 
    public function set color(val:uint) { 
     _color = val; 
     redraw(); 
    } 

    public function AbstractBox() { 
     this.addEventListener(MosueEvent.MOUSE_DOWN, handler) 
     redraw(); 
    } 

    // Mouse handler 
    private function handler(e:MouseEvent):void { 
     trace("DOWN!"); 
    } 

    // some internal work 
    private funciton redraw() { 
     this.graphics.clear(); 
     this.graphics.beginFill(this.color); 
     this.graphics.drawRect(10,10,50,50); 
    } 

    // other methods. 
} 

注意設置.color屬性將導致電影剪輯,重繪自身。

redBox.color = 0xFF0000; // where redBox is an instance name of an AbstractBox in the Flash UI. 
blueBox.color = 0x0000FF; 
+0

你猜我的代碼樣本非常好,我已經使用繼承來至少減少每個單獨的影片剪輯的文件。我只是想,可能有一種方法可以完全消除對每個對象單獨的類文件的需求,同時仍然在構造函數中有代碼。對不起,我不清楚的開幕帖子。 – Oddysen 2012-07-25 15:38:09

+0

@Oddysen更新了一些替代方案的答案。 – 2012-07-25 17:17:29