2014-04-02 65 views
0

在下面的代碼中,我有幾個都是TheBeetle()的MovieClip。它們位於另一個名爲gamelevel的MovieClip中,並且也被推入一個名爲bArray的數組中。以前我已經在gamelevel中對它們進行了索引,但是在調用事件偵聽器之後,我無法對它們編制索引,並收到錯誤「1118:將靜態類型Object的值隱式強制爲可能無關的類型flash.display:DisplayObject。」。當用戶點擊它們時,它們會死亡(並改變框架),並且屍體也會落在其他活體下,這就是我需要在死亡時將它們索引到1的原因。我明白錯誤在說什麼,但我該怎麼做我需要做的事情? 代碼工作得很好,但它不會在兩行我已經提到它,所以來看看,請:爲什麼我在這裏得到錯誤1118?

public function clicked (event:MouseEvent) 
    { 
     if (event.target is TheBeetle && event.target.currentFrame <= 2) 
     { 
      var mc:Object = event.target 

      // TheBeetle is actually a MovieClip but i cannot write: var mc:MovieClip = event.target, if i do i receive 1118 


       if (mc.currentFrame == 1) 
       { 
        mc.gotoAndStop (Math.floor(Math.random() * 3 + 4)); 
       } 
       else 
       { 
        mc.gotoAndStop (3); 
       } 
       mc.filters = null; 

       // Here i need to index the TheBeetle as i did before like gamelevel.setChildIndex(mc,1) but i'd receive 1118! 

       bArray.splice (bArray.indexOf(mc),1); 

       if (bArray.length == 0) 
       { 
        removeEventListener (Event.ENTER_FRAME,frameHandler); 
        waveTimer.removeEventListener (TimerEvent.TIMER_COMPLETE, changeLocation); 
       } 
     } 
    } 

回答

2

你需要顯式轉換目標到MovieClip類:

var mc:MovieClip = MovieClip(event.target); 

您可能需要在檢查目標的currentFrame之前執行此操作,因爲'Object'沒有currentFrame方法。

1

我會建議在使用事件和目標時使用軟鑄造。通過軟鑄造,如果你抓住了錯誤的目標,你就不會有問題 - 鑄造過程只是返回null

public function clicked (e:MouseEvent){ 
    var beetle: TheBeetle = e.target as TheBeetle; 
    if(beetle != null && beetle.currentFrame <= 2){ 
     //Work with beetle as you want 
    } 
} 
+0

嗯,是不是'TheBeetle(e.target)'等於'e.target作爲TheBeetle'?如果不是,返回null比獲取異常要好。 – Vesper

+0

他們不相等。 'TheBeetle(e.target)'會拋出異常,像TheBeetle @ as6d54sad不能被轉換成SomeAnotherClass @ asd5fas5df。這就像嚴格的演員陣容,但這種類型的演員陣容工作得更快。 –