2011-10-31 64 views
0

我在處理孩子如何引用父母變量時遇到了一些麻煩。Flash as3指的是父子變量

這裏是我的Main.as:

包 { 進口的flash.display.MovieClip;

public class Main extends MovieClip 
{ 
    public var i; 
    public var child: Child; 

    public function Main() 
    { 
     i = 4; 
     child = new Child; 
    } 
} 

}

這裏是我的Child.as:

包 { 進口的flash.display.MovieClip;

public class Child extends MovieClip 
{ 
    public function Child() 
    { 
     trace([parent as MovieClip].i); 
    } 
} 

}

孩子試圖訪問公共變量i的父母,但我得到的錯誤:

不確定

使用跟蹤(影片剪輯(父).I)而我得到:

TypeError:錯誤#1009:無法訪問空對象引用的屬性或方法。 在兒童() 在main()的

我覺得我失去了一些東西非常基本的(就像我還沒有確定的時候孩子的值構造),但我不知道是什麼。

澄清將不勝感激。

回答

1

當其經由.addChild().addChildAt()加入另一DisplayObjectContainer一個DisplayObjectparent屬性獲取設置。這些調用由Flash UI隱式創建,以將子項添加到可見對象。

所以,你在做什麼有一些問題,有些是關於DisplayObjects在flash中工作的誤解,還有一些是語法問題。

當你調用new Child(),要調用的Child類的構造函數,你的情況:

public function Child() 
{ 
    trace([parent as MovieClip].i); 
} 

在這一點上,它具有沒有增加了作爲一個孩子的DisplayObjectContainer。在父類中簡單命名爲child不會創建這種關係。所以在這種情況下,您的構造函數中this.parent總是支持null,因爲它只是創造了Child類的新實例,它沒有任何「父」

這裏有一個相當大的語法問題的知識,以及。您正在扮演as演員(如果類型不兼容,將返回null)。然而,在這種情況下,parent已經是null,但後來您使用的是[],這是寫入文字Array的方式。所以你本質上是創造一個新的Array與一個元素是null。然後你試圖在Array而不是父母身上獲得名爲i的房產。

顯然,這不是你想要做的......完全可以。你大概意思是這樣的:

public function Child() 
{ 
    trace((parent as MovieClip).i); 
} 

但是,即使這是不對的,因爲i不是屬性上MovieClip,它對你的Main子類的屬性。所以,你真的大概意思:

public function Child() 
{ 
    trace((parent as Main).i); 
} 

但是,這仍然會失敗,因爲就像我以前說過,parent == null因爲它沒有被添加作爲一個孩子呢。

考慮下面的代碼:

public class Main extends MovieClip 
{ 
    public var i; 
    public var child:Child; 

    public function Main() 
    { 
     i = 4; 
     child = new Child(); 
     child.doWork(); 
     this.addChild(child) 
     child.doWork(); 
    } 
} 

和:

public class Child extends MovieClip 
{ 
    public function Child() 
    { 
     doWork(); 
    } 

    public function doWork() 
    { 
     if(parent == null) { 
      trace("No parent yet.") 
      return; 
     } 

     var mainParent:Main = (parent as Main); 
     if(mainParent == null) { 
      trace("Parent isn't a instance of Main!") 
      return; 
     } 

     trace(mainParent.i); 
    } 
} 

這應該調用的方法doWork()三次:一次在孩子的構造函數,然後被添加到顯示樹之前,和最終被添加到顯示樹後。希望它會更有意義,看到它像這樣工作。

還有很多東西需要學習,特別是關於事件,事件冒泡以及DisplayObjectsDisplayObjectContainers如何相關/嵌套。但也許這會給你一個正確的方向。只要知道parent只是DisplayObjectMovieClip和Flash中許多其他類的祖先之一)的屬性。瞭解這些類如何相互協作,並用自己的功能擴展它們,這對於真正理解Flash來說至關重要。

+0

哇,謝謝你的令人難以置信的全面回覆,32bitkid。我最近開始學習as3,並在C語言中有過一些經驗 - 我在時間軸上的第一個關鍵幀中編寫的代碼通常做了我想做的事情。然而今天,我想我會試着弄清楚如何使用extenal .as文件並將它們分開,但這是一個徹底的失敗(直到你回覆)。所以再次感謝你花時間寫出了一個很棒的答案,你已經度過了我的一天! – xdl

0

父母基本上沒有設置,直到您調用的方法AddChild這樣:

public class Main extends MovieClip 
{ 
    public var i; 
    public var child: Child; 

    public function Main() 
    { 
     i = 4; 
     child = new Child; 
     addChild(child); 
    } 
} 
當然

,這意味着父母不菱,將在你的構造函數是不確定的。我有時會將父類添加到構造函數參數中,以便簡化與x/y位置一起添加(如果適當的話)。

public class Child extends MovieClip 
{ 
    public function Child(targetParent:DisplayObjectContainer = null, xpos:Number = 0, ypos:Number = 0) 
    { 
     if (targetParent != null) 
    { 
     targetParent.addChild(this); 
    } 

    this.x = xpos; 
    this.y = ypos; 
    } 
} 
+0

感謝您的回答老鷹!我完全忘了addChild(因此構造函數失敗) – xdl