2012-02-26 73 views
0

在我的舞臺功能是一個叫做盒子和一個影片剪輯影片剪輯稱爲信息框。 InfoBox有一個名爲setInfo的函數。點擊時,Box(它是一個MovieClip,而不是一個按鈕),想要調用InfoBox的setInfo函數。呼叫的兄弟影片剪輯

我使用盒下面的代碼嘗試:

MovieClip(this.parent).InfoBox.setInfo(); 

這將產生以下錯誤:

TypeError: Error #1034: Type Coercion failed: cannot convert flash.display::[email protected] to flash.display.MovieClip. 
at Box/infoBox() 

什麼是調用兄弟影片剪輯功能有道?

編輯
InfoBox.as看起來是這樣的:

package { 

    import flash.display.MovieClip; 

    public class InfoBox extends MovieClip { 

     public function InfoBox() { 
      //Constructor 
     } 

     public function setInfo(){ 
      trace("info set"); 
     } 
    } 
} 
+0

你是怎麼把孩子加入舞臺的?你可以發佈你的代碼嗎? – sch 2012-02-26 23:15:43

+0

我在Flash編輯器中手動添加了InfoBox。使用'stage.addChildAt(box,0);' – fishpen0 2012-02-26 23:39:38

回答

1

您應該設置一個名稱InfoBox。然後,您可以像這樣訪問它:

var b:InfoBox = this.parent.getChildByName(「InfoBox」) as InfoBox; 
b.setInfo(); 
+0

'1061:通過與靜態類型flash.display使用的參考呼叫可能未定義的方法setInfo:DisplayObject.' – fishpen0 2012-02-26 23:54:03

+0

嘗試用新的代碼。如果它不起作用,那麼我認爲'InfoBox'沒有'setInfo()'方法。你確定它確實嗎?另外,你確定你使用了正確的名字嗎? – sch 2012-02-26 23:56:46

+0

也許我搞砸了InfoBox。我將代碼粘貼到我原來的帖子中。 – fishpen0 2012-02-27 00:07:01

0

從孩子夾,你可以這樣做:

(parent as MovieClip).InfoBox.setInfo(); 
+0

從另一個腳本添加Box,這將無法正常工作,因爲我們在錯誤消息中看到父級是舞臺。所以'(父母作爲MovieClip)'返回'null'。另外我懷疑InfoBox是舞臺的一個屬性。 – sch 2012-02-26 23:13:43

+0

導致此錯誤: 類型錯誤:錯誤#1009:無法訪問空對象引用的屬性或方法。 \t在盒/信息框() – fishpen0 2012-02-26 23:32:32

0

該類的名稱是InfoBox,但您需要使用該類的特定實例的名稱。當您在Flash編輯器中手動放置動畫片段時,可以在屬性窗口中爲其指定一個名稱。

2

你不應該調用一個兄弟姐妹夾的功能。相反,從想要請求函數調用的子類派發事件,讓父代監聽它,然後讓父代調用適當的函數。這被稱爲「鬆耦合」,並將長期爲您服務。

+0

鬆耦合是否有特定的好處? – fishpen0 2012-02-27 21:50:45

+0

是的。這意味着你可以用派發相同事件的任何東西來替換組件,它仍然可以工作。或者你可以用別的東西替換另一個組件(或者在不改變那個剪輯/類的情況下,爲了響應該事件而發生完全不同的事情)。 – 2012-02-27 22:41:15

+0

舉個例子:我爲一家仍然陷於AS2的公司工作。每次我們從我們的某個產品的音頻版本轉到純文本版本時,我們會重複相同的工作,因爲下一個按鈕知道如何構建帶有指令的部件,因此不可能批量更換。相反,你必須進入並編輯指令的每一幀。我在整個週末花了大約8個小時製作了一套類,讓您只需5分鐘而不是5個小時即可從音頻切換到文本。 – 2012-02-27 22:43:53