2011-06-23 27 views
1

我想添加一個鍵盤事件監聽器到舞臺上,以檢測用戶何時單擊左側或右側的箭頭鍵。但是這個監聽器是從一個被導入到文檔類的類文件中調用的,因此我認爲它不知道「stage」是指什麼。我該如何解決這個問題?flash as3 - 訪問階段以外的文檔類

這是我的代碼:

文檔類:AugmentedReality.as:

package { 
    import examples.PlaneVid_Carousel; 

    public function AugmentedReality(){ 
    addChild (new PlaneVid_Carousel()) 
    } 
} 

PlaneVid_Carousel.as {

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

    public class PlaneVid_Carousel extends Sprite { 

     public function PlaneVid_Carousel(){ 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown 
     } 

     protected function keyPressedDown(e:KeyboardEvent):void { 
     //DO STUFF 
     } 

    } 

    } 
} 

回答

2

添加PlaneVid_Carousel後按鍵盤監聽器已經被添加到舞臺,那麼舞臺將是可訪問的。

public function PlaneVid_Carousel() 
{ 
    if (stage) init(); 
    else addEventListener(Event.ADDED_TO_STAGE, init); 
} 

private function init(e:Event = null):void 
{ 
    removeEventListener(Event.ADDED_TO_STAGE, init); 

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressedDown); 
} 

protected function keyPressedDown(e:KeyboardEvent):void 
{ 
    //DO STUFF 
} 

我總是對我的DisplayObject使用這個init方法,它是FlashDevelop的DisplayObject的默認模板。

+1

@mheavens,忘了我說的。我完全忽視了這樣一個事實,即你的班級實際上是一個雪碧。 @adam所說的是做這件事的適當方式。 – epologee

0

簡單的修復方法是在文檔類上添加一個靜態屬性,對於這個示例,這個屬性名爲MyApp.as。

public class MyApp extends Sprite { 
    public static var globalStage:Stage; 
    //... 

    public function MyApp() { 
     globalStage = stage; 
    } 
} 

這之後,你可以通過導入從任何地方訪問舞臺:您可以通過在時間像樣點,這對於大多數情況下,在文檔類可以在構造函數設置它分配一個值globalStage財產文檔類和調用這個片斷:

MyApp.globalStage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown); 

現在,它並不一定是一個屬性的文檔類,也許像StageProxy專用類會更清晰,你仍然可以從文檔分配給它類。

public function MyApp() { 
    StageProxy.stage = stage; 
} 

從任何地方訪問它:

StageProxy.stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown); 

這仍然不是我稱之爲「乾淨」或「漂亮」,但它能夠完成任務。