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