2013-01-18 78 views
0

我有一個名爲doorKey的movieclip(稱爲doorKey),它位於名爲visuals的movieclip中。引用Movieclip中的movieclip命中

Normaly當你穿上AS3東西的時間線內,而不是內部的包,你可以做到以下幾點:

if (player.hitTestObject (visuals.doorKey)) 

如何在包中做到這一點?

研究: Reference MovieClip After it is Added to Stage as a Child

package 
{ 
import flash.display.MovieClip; 
import flash.events.*; 


public class Test extends MovieClip 
{ 
public var keyCollected:Boolean = false; 
public var doorKey:Visuals = new Visuals(); 
public var visuals:Visuals; 

public function Test() 
    { 

     visuals.x = 25; 
     visuals.y = 475; 
     addChild(visuals) 


     function loop(e:Event):void 
     { 
if (keyCollected == false) 
     { 
      //trace("player "+player); 

      if (player.hitTestObject (doorKey)) 
      { 
       doorKey.visible = false; 
       keyCollected = true; 
       trace("key collected"); 
      } 
     } 
+0

頂部1不好的做法 - 嵌套函數 –

+1

嘗試寫一些東西來幫助你,但是這一切都歸結到這...您需要學習課程的核心概念,動畫片段以及舞臺上的事物是如何連接的。此外,請嘗試更加簡潔地瞭解您要求的內容以及事情的相關方式。 我們不知道什麼是創建「測試」,當循環觸發器和它是什麼觸發它。我們不知道視覺效果是什麼樣子以及它爲什麼設置爲pos(25,475)。我們也不知道玩家是什麼樣子,它的範圍和運行遊戲時會發生什麼,以及您期望發生什麼...... –

回答

1

如果你使用Flash Professional和Test是你的文檔類FLA,並且你有一個實例視覺效果的視覺效果命名和實例命名的球員,他們都在舞臺上那麼這段代碼應該爲你工作

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

public class Test extends Sprite  //Document class 
{ 
    public var visuals:Visuals; //instance exists in FLA, doorKey is an instance on visuals 
    public var player:Sprite  //instance exists in FLA 

    public var keyCollected:Boolean = false; 

    public function Test() //Called when Test is created (when your swf loads since its the document class) 
    { 
     //To have a function loop every frame render 
     this.addEventListener(Event.ENTER_FRAME,enterFrameHandler); 
    } 

    private function enterFrameHandler(event:Event):void{ 
     if(player.hitTestObject(visuals.doorKey)){ 
      visuals.doorKey.visible = false; 
      keyCollected = true; 
      trace("key collected"); 
     } 
    } 
} 
} 

如果這些沒有在舞臺上存在,那麼你就需要實例並將它們添加在你的構造函數中:

public function Test() 
{ 
    visuals = new Visuals(); 
    player = new Sprite(); 
    addChild(visuals); 
    addChild(player); 
    //To have a function loop every frame render 
    this.addEventListener(Event.ENTER_FRAME,enterFrameHandler); 
} 

Wh通過在Adobe Flash中使用FLA,它會自動創建實例,將它們添加到文檔對象顯示列表(addChild)中,並根據它們在編輯器中的名稱設置文檔類的變量。上面顯示的時間線代碼利用了相同的功能。在這個例子中,舞臺上已經有一個玩家實例,並且參考玩家已經設置了它。視覺效果(包含doorKey屬性)相同。如果這些相同的名稱存在這些情況,那麼這行應該仍然適用:

if (player.hitTestObject (visuals.doorKey)) 
0

如果你讓測試類的文檔類,FLA文件,比player.hitTestObject(doorKey)會工作。但是在你的代碼中,你有一個方法「循環」,事件作爲參數,所以你必須有其他事情會觸發事件

+0

我很難理解將觸發事件的解決方法。您能否請您發佈一個同樣適用的不同觸發器的示例。 – Jacques

+0

我試着理解這裏發生了什麼http://stackoverflow.com/questions/126385/is-it-a-bad-idea-to-implement-a-timer-loop-in-flex/127343#127343但我失敗了了解如何使用它 – Jacques

+0

我可以使用TimerEvent.TIMER嗎?創建一種循環?在這裏找到http://stackoverflow.com/questions/5223663/having-difficulty-in-understanding-actionscript-3-timer-class – Jacques