我想扩展Event类以添加我在游戏中使用的一些事件。 但我不希望新的事件类具有旧的公共静态类型。 例如,我不想拥有:
NewEventClass.ENTER_FRAME
如何在不将旧类型混合的情况下扩展Event类?
有没有办法超越AS3以省去不合适的类型?
或者我应该完全避免创建新的事件类型并添加新字符串吗?
答案 0 :(得分: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)
等中使用的常量,那么您可以创建一个包含这些常量的类,并且与事件没有任何关系:< / p>
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:通过a访问可能未定义的属性ENTER_FRAME 静态类型Class的引用。