2011-12-20 59 views
0

我想擴展Event類來添加一些我在遊戲中使用的事件。 但我不希望新的事件類有舊的公共靜態類型.. 舉例來說,我不希望有:AS3如何擴展事件類而不保留任何現有的事件類型?

NewEventClass.ENTER_FRAME 

你如何去沒有得到的擴展事件類舊的類型混合在一起?

有沒有什麼辦法可以智取AS3以省略不需要的類型?

或者我應該避免創建一個新的事件類型,只是添加新的字符串?如果你想添加一些額外的屬性添加到它,例如

回答

7

擴展事件僅真的必要:

public class EnemyEvent extends Event 
{ 
    // Constants used to represent event type 
    public static const ENEMY_KILLED:String = "killed"; 

    // Event properties 
    public var score:int = 0; 

    /** 
    * Constructor 
    * Retain Event behaviours 
    */ 
    public function EnemyEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
    } 
} 

所以,當你發送從敵人這個事件中,你可以去:

var evt:EnemyEvent = new EnemyEvent(EnemyEvent.ENEMY_KILLED); 
evt.score = myScoreValue; 

dispatchEvent(evt); 

然後利用score財產從遊戲引擎內的收聽方法:

enemy.addEventListener(EnemyEvent.ENEMY_KILLED, _countKill); 
function _countKill(e:EnemyEvent):void 
{ 
    gameTotalScore += e.score; 
    if(gameTotalScore > 100) getAchievement(); 

    e.target.removeEventListener(e.type, _countKill); // <-- woudn't work without extending event either 
} 

如果你只需要存儲常量addEventListener(x, ..)使用,new Event(x)等那麼你可以只讓持有這些並沒有任何與事件類:

public class CustomEvents 
{ 
    public static const MY_CUSTOM_EVENT:String = "myCustomEvent"; 
} 

這樣你可以只使用這些需要:

  • new Event(CustomEvents.MY_CUSTOM_EVENT);
  • addEventListener(CustomEvents.MY_CUSTOM_EVENT, _listener);

前一種方法仍然是可取的,因爲它更整齊,更合乎邏輯。

此外;您的有關您的自定義事件的註釋具有常數,例如ENTER_FRAME並非如此,因爲它們是static並且屬於事件。如果你試圖在你的答案通過例如訪問ENTER_FRAME你會得到這個錯誤:

1119:通過 參考靜態類型類可能未定義的屬性ENTER_FRAME的訪問。