AS3如何在不保留任何现有事件类型的情况下扩展Event类?

pep*_*dip 0 inheritance class actionscript-3

我想扩展Event类来添加我在游戏中使用的一些事件.但我不希望新的事件类具有旧的公共静态类型.例如,我不希望:

NewEventClass.ENTER_FRAME
Run Code Online (Sandbox Code Playgroud)

如何在不将旧类型混合的情况下扩展Event类?

有没有办法超越AS3以省去不合适的类型?

或者我应该完全避免创建一个新的事件类型并添加新的字符串?

Mar*_*rty 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当你从敌人那里派遣这个事件时,你可以去:

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

dispatchEvent(evt);
Run Code Online (Sandbox Code Playgroud)

然后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
}
Run Code Online (Sandbox Code Playgroud)

如果你只需要存储常量在使用addEventListener(x, ..),new Event(x)等那么你可以让持有这些并没有任何与事件类:

public class CustomEvents
{
    public static const MY_CUSTOM_EVENT:String = "myCustomEvent";
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以根据需要使用它们:

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

前一种方法仍然更可取,因为它更整洁,更符合逻辑.

另外; 关于你的自定义事件的注释,例如ENTER_FRAME情况并非如此,因为它们static属于Event.如果您尝试ENTER_FRAME通过答案中的示例进行访问,则会出现此错误:

1119:通过具有静态类型Class的引用访问可能未定义的属性ENTER_FRAME.