2012-08-27 61 views
0

OK,我不是很習慣Flash和我已經卡住小時在這個問題上,所以任何幫助將非常感激...
我有一個基本建立這樣這個相當複雜FLA:AS3:MovieClip(root)的計算結果爲null?

  1. 「場景1」

    • 一些加載動畫(和代碼)
    • AS碼從Flash變量接收值(在HTML代碼中),並在電子驗證他們
    • 第二場景1時間軸,我們進入第二個影片剪輯:
  2. 「地圖 - 總」

    • 這裏被顯示在地圖和各種要素在這裏動作出現在它
    • 什麼有趣-wise
    • 但這些要素中的,電影剪輯:
  3. 「BTN-VB」

    • 這裏,各個層;其中的一個包含另一個影片剪輯(vb_anim)
    • 還包含了一些AS代碼,使vb_anim做大因爲在它的鼠標滾動,和反向當鼠標離開(和響應點擊)
  4. 「vb_anim」

    • 這裏我們找到了幾個圖層,並帶有一些基本動畫。
    • 這些層中,三代表一個相同的按鈕的不同變體(可得,未準備就緒,被禁止)。
    • 每個這三個層中的含有一個實例化的對象(具有一些漸變)

我需要的是這樣的:
根據我接收在場景1中的Flash變量,我需要顯示或隱藏「vb_anim」中的三個對象中的一個或幾個。

爲了訪問場景1設置變量,我用下面的快捷鍵:

var global:MovieClip = MovieClip(root); 
// allows for access to the "root" variables 
// e.g. global.myVar 

我已經使用相同的代碼在「BTN-VB」(我需要訪問由提供的信息flashvars爲了定義onclick事件),它就像一個魅力。

然而,似乎從內部「vb_anim」調用時,影片剪輯(根)的計算結果爲空。因此,從場景1訪問變量是不可能的,而當我嘗試這樣做時,Flash會拋出「TypeError:Error#1009」。

由於「vb_anim」簡直是嵌入在「BTN-VB」,我不明白爲什麼不能看到影片剪輯(根),而其家長可以。

什麼,我做錯了任何想法?

+0

你可以發佈更多的代碼,或者你的根? – BadFeelingAboutThis

回答

1

在IDE中的MovieClip的時間軸上聲明變量屬於該剪輯獨自一人,在IDE代碼生成器將生成從中類字段爲它生成時使用的影片剪輯的類。我猜想這就是爲什麼它不起作用。即您只在與包含該代碼的MovieClip關聯的代碼可訪問的位置聲明此變量,但與您所稱的代碼相反,它不是全局的。

ActionScript實際上並沒有全局變量的概念,變量可以被定義爲一個類(字段,或者也稱爲成員),或者是包級變量(很少使用,很大程度上不鼓勵實踐),而第二種類型有時候可以滿足全局變量的目的,但它沒有提供確保唯一性的機制,從而成爲潛在的錯誤和/或安全風險的危險。在AS3中沒有辦法解決這個問題,這就是爲什麼完全避免它的原因。

但是,這不是你的代碼的唯一問題。您只需將root轉換爲MovieClip,因爲它可以讓您避免類型檢查(使代碼更容易出錯)。解決這種情況的正確方法是爲根容器創建一個類,並通過IDE的方式(IDE將此類稱爲「文檔類」)將其分配給根容器。然後,無論何時使用root,您都可以將其轉換爲該類,從而允許代碼幫助和編譯器幫助您更快地編寫更安全的代碼。

+0

感謝您的回答。我對使用課程並不確定(因爲我的課程時間很緊,對使用課程不熟悉),但確實是正確的做法。 – s427

+0

我仍然不明白爲什麼我可以在我的level3上訪問MovieClip(root),但不在我的level4上(儘管它只是嵌入到level3中)... – s427

0

時間軸上任何地方的所有MovieClip(或通過ActionScript添加,除實際Loaders外)都有一個loaderInfo屬性,指向相同的loaderInfo,因爲您已經在讀取參數,因此您不需要引用根。

此外,它是非常糟糕的做法對孩子瞭解其父母/祖父母/等任何東西。見encapsulation。相反,讓孩子暴露父母可以填充正確信息的屬性(變量)。所以,你的主要時間表將信息提供給btn-vb,它們都使用它並將它傳遞給vb_anim。

+0

其實我需要訪問根上的其他變量(不僅僅是來自loaderInfo的參數)。無論如何,我設法通過使用我可以從任何地方訪問的類來解決問題。無論如何感謝您的回答。 – s427

+0

希望這個項目不會變得很大或需要由不止一個人維護。 –