2011-03-04 42 views
0

我們正在製作一些帶有一些相當複雜的動畫的Flash瀏覽器遊戲。我們的設計師正在Flash Professional中製作動畫,而我將所有東西接線並通過AS3添加一些邏輯(使用FlashDevelop)。我應該如何用AS3在較大的動畫中替換圖像?

在我們更復雜的動畫之一中,「獎勵項目」在屏幕上移動。它充滿了各種各樣的特效,因此它會消失幾幀,然後再次出現。

從AS3我們希望能夠動態地決定哪些加分項目(比如蘑菇或星形)到動畫包括。我們不希望要求我們的設計師爲我們的每個獎勵項目複製整個動畫。

這是我們已經試過:

創建兩幀(1種蘑菇,1個星幀)的FlashPro 「BonusItem」 影片剪輯和ActionScript導出。 在FlashPro中創建複雜的動畫影片剪輯,並將BonusItem動畫片段添加到相關的幀中。給所有必要的KeyFrame上的實例名稱BonusItem實例。導出ActionScript的整個動畫片段(導出爲「ComplexAnimation」)。

意向:

的目的是能夠做到這一點:

var complexAnimation:ComplexAnimation = new ComplexAnimation(); 
complexAnimation.bonusItem.gotoAndStop("star"); // Frame labels have been added in FlashPRo. 
this.addChild(complexAnimation); 

這玩複雜的動畫與明星,我們可以方便地調用gotoAndStop(「蘑菇」),以用蘑菇玩同樣的動畫。

問題:

的第一個問題是,complexAnimation.bonusItem是在上述行02空。我通過處理complexAnimation的ADDED_TO_STAGE並將第02行放在處理程序中解決了這個問題。

接下來的問題是,每一次bonusItem的movieclip開始補間,或者如果它不存在於一些幀,並隨後重新加入complexAnimation.bonusItem屬性/參考被重新分配給新bonusItem實例。然後我必須找到一種方法來知道這種情況何時發生,並在新實例上調用gotoAndStop(「明星」)。

我發現兩種方法可以做到這一點:

1)請收聽complexAnimation添加的事件與「bonusItem」的target.name。在強類型語言中有點廢話不得不求助於匹配的字符串,但這是有效的。順便說一下,當ADDED事件被觸發時,新的框架對象引用仍然爲空。

2)收聽FRAME_CREATED事件。這種情況發生在新幀引用初始化的地方,比ADDED晚。因此,我可以檢查complexAnimation.bonusItem是否非空,然後調用gotoAndStop(「star」)。與此有關的一個問題是調用gotoAndStop會觸發另一個FRAME_CREATED事件觸發,所以我需要防範無限循環。再次,它的工作原理,但我沒有很好的感覺。

結論:

嗯,我真的沒有其他的結論比我覺得我的工作真的很難做一些比較簡單的。我希望有更簡單的方法。我有強烈的感覺,我瘋了。任何人都知道更好的方法來做到這一點?

+0

如果我理解正確,你有一個動畫路徑,你想跟隨一些隨機圖像,對吧? – Veehmot 2011-03-04 22:56:40

+0

圖像實際上並不遵循動畫路徑(或運動向導)。它在整個動畫過程中會經歷許多直線調整。我希望能夠以編程方式在AS3中指定要使用的圖像。 – 2011-03-05 13:41:17

+0

我在上述帖子中發生了錯誤。 Flash確實分配了一個BonusItem的新實例,但它是由掩碼圖層關鍵幀而非補間造成的。 – 2011-03-09 19:36:19

回答

0

我想我會用我們目前的(希望是長期的)解決方案更新這篇文章。

首先,我做出上述職位的錯誤:

下一個問題是:每一bonusItem影片剪輯補間開始的時間......在complexAnimation.bonusItem屬性/引用被重新分配給新bonusItem實例。

這是不正確的。 Flash確實分配了一個BonusItem的新實例,但它是由掩碼圖層關鍵幀而非補間造成的。

我一直很想盡量避免有任何依賴字符串比較的邏輯,但最終我吞噬了我的自尊心,讓生活更輕鬆。

我們的設計人員給出了時間軸中每個關鍵幀上的所有相關對象(我們需要從AS3訪問的東西)實例名稱。如果對象嵌套在其他對象中,我們的設計者也必須分配這些父對象實例名稱。我們必須協調這些實例名稱,以便開發人員知道訪問者被稱爲什麼 - 我們將不得不這樣做。我們的設計師還必須爲每個相關動畫片段(例如BonusItem)「導出動作腳本」。

在AS3中,我們使用Robotlegs進行依賴注入,並將其作爲我們的MVC框架的基礎。 Robotlegs建議應用程序特定的邏輯應該與特定於視圖的邏輯分開。它允許我們指定一個邏輯類(稱爲Mediator)與每個視圖和任何視圖相關聯。因此,我們可以做以下的映射:

BonusItem -> BonusItemMediator 

這意味着,每一次的Flash創建時間表的Robotlegs莫名其妙地知道它在BonusItem並創建BonusItemMediator(我們寫自己和完全控制的新實例)。另外,Robotlegs可以很容易地從我們的BonusItemMediator引用它的相關視圖實例(BonusItem實例)。所以在我的BonusItemMediator中,我可以詢問視圖引用的實例名稱是什麼。我也將其父母帶到舞臺上並記錄他們的每個名字,以生成唯一指定BonusItem實例的實例名稱的結果字符串。 例如

"game.complexAnimation.bonusItem" 

有一次,我知道這是我可以保證bonusItem正顯示出正確的圖像(星形或香菇),用下面的代碼:

var frameLabelName:String myGameModel.whatTheHellShouldThisBeShowing("game.complexAnimation.bonusItem"); 
this.view.gotoAndStop(frameLabelName); // where view is the BonusItem instance 

所以現在不管閃存如何或何時看似隨機決定摧毀並重新創建我的bonusItem我會聽到它,並可以確保新的BonusItem實例顯示在正確的框架上。

這個解決方案的主要缺點是我們依賴於字符串比較。我們的設計人員很容易錯誤輸入一個實例名稱,直到代碼在運行時才被敲擊,我們纔會聽到它。當然,測試可以緩解這種風險,但我仍然覺得我使用強類型語言是一種遺憾,但是卻沒有使用編譯時類型檢查。

0

如果您有在時間線上存在的對象,它有一個實例名,你需要能夠通過時間軸的持續時間,保持對它的引用,那麼它必須每一幀上存在(並在同一層!)的動畫片段。我授予你,你的解決方法可以完成工作,但你已經經歷了這樣做的痛苦。

阻力最小的路徑是在任何時候都有對象存在。如果用戶不應該「看到」它,就把它隱藏在屏幕外的某個地方。只要確保它始終在第1幀到最後一幀的時間線層上連續存在。

我建議的另一件事是停止深度嵌套影片剪輯,希望將這些嵌套剪輯用作狀態表示。這是在AS2時代很難做到的事情之一,但在AS3的瘋狂中已經變得不切實際。任何深於1層的東西都會進入一些冒險的領域。 3層深,你需要重新考慮你的策略。也許從庫中實例化不同的動畫片段實例並動態添加/刪除而不是依賴幀。

+0

即使對象連續存在於所有幀上,我仍會遇到問題。每次對對象進行補間時,Flash都會創建一個BonusItem的新實例並將其分配給我的complexAnimation.bonusItem引用。因此,我仍然不得不通過監聽事件來告知BonusItem的每個新實例在相關框架(星形或蘑菇形)上gotoAndStop。感謝迄今爲止的輸入。 – 2011-03-05 13:46:31