2011-06-09 117 views
9

我一直在使用ActionScript 3編程了一小會兒,我已經注意到,我的代碼的自然進程似乎採取一個巨大的文檔類的形式,與幾十個成員變量,回調和處理舞臺上的對象。總之:這有點混亂!如何避免凌亂的AS3代碼

事情是,我真的沒有看到它的方式(至少還沒有)。我在時間軸上使用不同的關鍵幀來表示應用程序中的不同狀態,雖然我在時間軸上有一些代碼(對於像鼠標點擊影片剪輯那樣的快速操作),但大多數邏輯只是傾倒在主文檔類。

所以,我不知道......有什麼好的方法來幫助neaten了這個代碼,走了野生?或者這是正常的?我來自C++背景,我喜歡編寫面向對象的東西,但是我看不到將這種結構傳遞給Flash的方法。任何洞察力將非常感激。

謝謝

回答

9

您可以將許多C++技能應用於您的AS3項目。

有很多技巧。很高興你提出了在主要時間表上放置代碼。我沒有在時間軸上放置代碼(這在AS2程序中很常見,而在AS3中可以完全避免),所以我建議將每個對象作爲一個單獨的類來考慮。例如,您正在使用鼠標點擊代碼的動畫片段可以是使用其自己的類創建的對象。說MovieClip是一個球的圖形。你應該創建一個擴展(繼承)MovieClip類一個「球」級,並在其處理的鼠標點擊事件:

package 
{ 
    import flash.display.MovieClip; 
    import flash.events.MouseEvent; 

    public class myObjects.Ball extends MovieClip 
    { 
     public function Ball() 
     { 
      this.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
     } 

     private function mouseDownHandler(event:MouseEvent):void 
     { 
      // Code 
     } 
    } 
} 

然後,找到你在圖書館窗格球的影片剪輯,右鍵單擊它,屬性,切換到高級模式,勾選導出爲AS。現在,請注意您的MovieClip已經將MovieClip類引用爲其基類了嗎?因爲你的Ball類擴展了MovieClip類,所以你不會再需要這個了。所以在Class字段中寫入'myObjects.Ball'並清除Base類字段。如果您編寫了Flash IDE可以找到的名稱空間Ball類的路徑,則應該看到一個綠色複選標記。

現在,您的Ball類將使用該MovieClip,因此當您在主類中創建Ball的新實例時,可以使用它作爲MovieClip並動態地將其附加到舞臺上。或者,您可以通過在該處手動拖動Ball MovieClip將其添加到時間線中。

擴展我解釋的類是AS3的'繼承'版本(Ball類繼承MovieClip類)。你也可以使用其他的OO概念,如polymorphism和封裝。儘可能將代碼封裝到單獨的類中。假設您的項目中有幾種不同類型的球形動畫片段,並且您希望球形課程成爲足球,球形球和棒球的父級。每個孩子課程都可以擴展Ball類。我發現對於大型項目有用的另一件事是創建一個靜態類來處理我的應用程序的所有事件。因爲我將它定義爲public static class,所以我可以將它導入到每個類中,並且只在應用程序的持續時間內爲其創建一次變量。這可能非常有用。

我也在類中創建了自己的僞析構函數,以便像使用C++一樣使用AS3。最簡單的方法是在銷燬對象的實例之前調用僞析構函數。我確實是在一個應用程序中自動實現的,所以如果我感興趣的人可以追蹤代碼......但AS3處理幕後的垃圾回收,通常不需要析構函數,但也許我只是認爲它不是必需的,因爲我在AS3編程中養成了很長時間的壞習慣。個人而言,我認爲你越努力在AS3中開發應用程序就好像你正在用C++開發一樣,獲得的樂趣越多,代碼的可重用性越高。保持它..很快,而不是一堆代碼,你會有一堆動作文件大聲笑..一把雙刃劍,但whatevs一點點。

+0

+1答案。我認爲要記住的主要事情(考慮OP來自C++)是時間線代碼可能是非常不可預測的,應該是(極少數例外)不惜一切代價避免。使用as3中的所有面向對象功能,它也是不必要的。 – Bosworth99 2011-06-09 14:53:35

+0

對。我認爲,當我第一次進入AS時,我形成了一些不好的習慣......並且因爲他們得到了我的結果而陷入了困境。但是,是時候以正確的方式做事了。 – 2011-06-09 15:01:38

+0

絕對。 Flash IDE中的時間線編碼是貧民窟,應該用適當的類文件替換。此外,您還應該使用較細的Sprite對象而不是MovieClip對象。 – TheDarkIn1978 2011-06-10 04:52:02

1

使用MVC框架。有些人覺得他們是有限制的,但是每次我不用一個「簡單」項目時,範圍就會擴大,我對我做出的糟糕決定感到恐懼。

一個很好的框架,讓您擺脫對某些應用方面的決策,並允許你實現一致的方式事情。

一個好的框架還允許您在其他項目中重用。

一個好的框架已經陷入它工時萬噸,將能更好地想出比大多數人可以放在一起沒有同樣的努力。

我用PureMVC,但任何流行的應該工作。

2

那麼,你可以做的第一件事就是將每個應用程序的狀態封裝在MovieClip中。然後,您將能夠爲此MovieClip分配一個班級,並且您是否在佈線(事件&)。

人事方面,我會把時間表放在一起。以下是我的工作方式:

我在Flash Builder中創建了一個純粹的ActionScript項目。我在lib文件夾中添加任何外部庫。 我在Flash Pro中爲我的資產創建了一個fla。這個fla導出了一個swc,它與我的Flash Builder項目相關聯。

您也可以嘗試RobotLegs。這是一個微小的MVC框架,可以幫助您連接應用程序。

2

首先,如果不是真的必須的,也可以不與代碼做什麼,不要在舞臺上使用時間軸和元素。我的fla只有1層,1幀,沒有舞臺。但是我確實有圖書館需要的所有圖形元素鏈接到類。如果我對這些元素做的不多,我會保留它們的基本分類(大部分時間是電影剪輯),但是如果我打算對它們進行一些操作,我將它們鏈接到自定義類。

我還根據自己的需要組織我的lib文件夾。例如:

lib 
    -> gui 
    ->Controls.as (Controls class) 
    -> etc.. 
    -> elements 
    -> Ball.as (Ball class for controling bal element) 
    -> Hammer.as (Class for controling hammer) 
    -> etc.. 
    -> animation 
    ->Tween.as (custom tween class) 
    ->etc.. 
    -> data 
    -> XmlParser.as (class for getting data from xml) 
    -> etc.. 

當然,這個結構只是一個例子,可以用你需要的任何方式來組織。

除此之外,我嘗試從顯示部分分離邏輯部分,有時也分離數據部分。

隨着每個項目我建立我自己的外部庫,其中我把當前項目創建的可重用類,我知道或我認爲他們將/可以在未來的項目中使用。

1

既然你從一個OOP背景你不應該有這個問題。但是,通過快速瀏覽一些精彩的書籍很容易解決這個問題。

基本的ActionScript 3.0 http://www.amazon.com/Essential-ActionScript-3-0-Colin-Moock/dp/0596526946

的ActionScript 3.0的設計模式。 http://www.amazon.com/ActionScript-3-0-Design-Patterns-Programming/dp/0596528469

隨着你的面向對象的背景,這些都是完美的。

如果你得到一個顯而易見的想要做的大文件就是先把事情分解成類。

如果您無法在AS3中可靠地編寫OOP,那麼您將會在MVC或任何其他設計模式上浪費時間。

1

退房Robot Legs - 這是一個很棒的MVC框架,它的確幫助我編寫比我平常更清潔(而且更少)的代碼。

我也建議羅伯特·潘納的Signals庫有三個原因:1)它可以讓你編寫更少的代碼2)類不再需要擴展EventDispatcher 3)我害怕'喜歡它!

我不能強調使用MVC框架 - 它提供的用於組織代碼的文件/文件夾結構是值得的。

+1

類不必爲了派發事件而擴展eventDispatcher。通過讓類實現IEventDispatcher並將EventDispatcher對象作爲其成員變量之一,它可以通過組合實現相同的結果。爲了使定位工作正確,當你實例化成員EventDispatcher時,你在構造函數new EventDispatcher(this)中傳遞「this」作爲參數; – scriptocalypse 2011-06-09 16:02:30

+0

@scriptocalypse這是一個有趣的戰術,但Singals仍然是我的首選方法:) – 2011-06-09 16:56:12