2011-04-11 91 views
0

我動態使用下面的代碼添加了一個影片剪輯:在動態添加訪問實例MC

var apie=new cPie() 
apie.x=100 
apie.y=100 
stage.addChild(apie) 

我現在有我的舞臺餡餅。百勝。假設這個工作就像通過拖放放置在舞臺上的影片剪輯一樣,我添加了這個來更改餅圖中的一個實例。

var apie=new cPie() 
apie.x=100 
apie.y=100 
apie.cherry.gotoAndStop(2) 
stage.addChild(apie) 

cherry是cPie影片剪輯中的一個實例,它是由3個幀組成的另一個影片剪輯。我希望它進入第二幀。通常情況下,做這樣的工作,但與影片剪輯當試圖通過ActionScript添加我面臨着以下運行時錯誤:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at pies_fla::MainTimeline/frame1() 

與往常一樣,返回的錯誤並不能幫助我解決這個問題在所有。這與「隱性強制」一樣晦澀難懂,這對我而言並不是英語專業沒有意義。我所知道的是我做錯了一些事情,結果我得到這個錯誤。正確的方式去這個將非常讚賞。

P.S.我打算在一個循環中使用它。請考慮這一點。

回答

0

我想這個錯誤是由行apie.cherry.gotoAndStop(2)造成的。您可能必須將其更改爲apie.getChildByName("cherry").gotoAndStop(2),但由於您的餡餅是動畫片段,所以兒童通常不會立即實例化。

解決方法是在嘗試訪問影片剪輯的子項之前等待畫面重新繪製。

0

,你有這個錯誤的原因是因爲cherry不是cPie對象的屬性或方法,它爲您cPie顯示對象容器的子顯示對象實例名稱。要訪問cherry顯示對象,您必須使用cPie對象的繼承DisplayObjectContainer方法,即getChildByName()方法。還好,這是由frankhermes另一個答案已經解釋過,所以我會解釋給下面的示例訪問的子顯示對象另一個(而且可能更好)的方法:

CherryPie.as:

package display 
{ 
    import flash.display.MovieClip; 

    public class CherryPie extends MovieClip 
    { 
     private var _cherry:MovieClip; 

     public function get cherry():MovieClip 
     { 
      return _cherry; 

     }// end function 

     public function CherryPie() 
     { 
      _cherry = cherryMC; 

     }// end function 

    }// end class 

}// end package 

Main.as:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      init(); 

     }// end function 

     private function init():void 
     { 
      var cherryPie:CherryPie = new CherryPie(); 
      cherryPie.x = 100; 
      cherryPie.y = 100; 
      cherryPie.cherry.gotoAndStop(2); 
      addChild(cherryPie); 

     }// end function 

    }// end class 

}// end package 

通過爲cherryPie_mc影片剪輯創建一個基類,你可以創建一個名爲cherry財產,在啓動中的C cherry子顯示對象分配給它姑娘。這樣你就可以直接訪問類的cherry子顯示對象:

cherryPie.cherry.gotoAndStop(2); 

,而不是:

cherryPie.getChildByName("cherryMC").gotoAndStop(2); 

您可以設置CherryPie類作爲cherryPie_mc影片剪輯的基類,如下所示:

注意:符號屬性中的「名稱」應爲「cherryPie_mc」 Symbol Properties

也爲那些想知道爲什麼我沒有設置cherry作爲公共財產

public var cherry:MovieClip; 

,而是使用一個getter方法來訪問私有財產

private var _cherry:MovieClip; 

public function get cherry():MovieClip 
{ 
    return _cherry; 

}// end function 

是讓櫻桃對象讀 - 只有通過省略setter方法才能完成。我將它設爲只讀的原因是爲了避免類似以下內容:

cherryPie.cherry = new FakeCherry(); 
+0

你有點飛過我的頭。我無法真正理解這一切,特別是因爲我不想使用包,所以我不知道如何將其轉換爲正常的幀內AS。你能提供一個沒有包的解決方案嗎? – Anonymous 2011-04-11 19:59:51

+0

我個人建議不要使用時間軸,但即使您這樣做,也並不意味着您也不能使用自己的用戶定義類。只需在你的源代碼根目錄下創建一個文件夾(你的情況可能在包含你的「fla」和「swf」文件的文件夾中),然後在你的「display」文件夾中創建一個名爲「CherryPie」的「as」文件,將CherryPie類複製並粘貼到該文件中。然後更改「cherryPie_mc」動畫片段的符號屬性,使其與匹配答案中的屏幕截圖相匹配。 – Taurayi 2011-04-12 11:39:06