2011-12-20 3 views
0

Я хотел бы расширить класс Event, чтобы добавить некоторые события, которые я использую в игре. Но я не хочу, чтобы новый класс событий, чтобы иметь старые общественные статические типы .. Например, я не хочу иметь:AS3 Как расширить класс событий без сохранения существующих типов событий?

NewEventClass.ENTER_FRAME 

Как вы идти о расширении класса Event, не получая старые типы смешались?

Есть ли какой-либо способ перехитрить 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 собственности через ссылки с классом статического типа.