在Actionscript3中创建自己的事件,它是如何工作的?

时间:2011-07-21 19:55:29

标签: flash events actionscript flash-cs5 dispatchevent

我会尽力做到客观:) 我想知道如何以及为什么有人需要创建自己的活动。我实际上知道该怎么做,但我不知道做这样的事情。你能给我一个例子,说明为什么要创建你自己的活动吗?

我在网上查找答案,但我从未找到过......

抱歉我的英语:)

4 个答案:

答案 0 :(得分:2)

让我们尝试将观察者模式与“手动”对象通知系统进行比较......我确信每个人在开始编程时都会对此感到内疚。

public class GameX{
   public function GameX(){
      var b = new Button(this); //we send a reference to button
   }
   public function buttonAction(){
       //do something based on this
   }
}

public class Button(){
   private var listener:
   public function Button(listener:GameX){
      this.listener = listener;
      someButtonThing();
   }
   public someButtonThing(){
      listener.buttonAction();
   }
}

让我们迭代这个代码会遇到的问题...

1)我想在另一款游戏GameY中使用Button类吗?这是一个问题吗?

当然是,在按钮类中编译时间依赖于GameX ...是的,你可以通过其他方式改变这个或作弊,但这不容易或标准化......标准化可能是关键的事情之一观察者模式...为什么它如此好。这也打破了封装...更多关于这一点。

2)我想同时收听GameYComponent1和GameYComponent2!我能这样做吗?

同样,您可以“欺骗”并更改此代码,但同样,您必须更改Button类,并且再次,它不会像观察者模式(事件事物)那样标准化。很多时候你根本不能......你能做的最好的就是它的子类。要做很多工作。也没有标准化。

3)你想要某种非常复杂的事件调度机制,比如as3中的显示对象列表(抱歉,我现在无法在网上找到这个好的链接,如果有人可以稍后编辑,请在中添加链接。

我可以迭代到明天,有些人可以比我更好地解释它,但基本上,不使用观察者模式可能会破坏封装并迫使你一遍又一遍地修改Button类...它也会不像事件那样标准化......不需要重新发明轮子,创建观察者模式来解决这些问题。

在任何情况下,我都会在15分钟内向一个刚接触编程的人解释为什么要使用事件或自定义事件。它为所有参与者避免了很多头痛。

要进行更全面的研究,请试试这些链接(我只是掩饰了这些内容,但这里应该有一些道理):

如果有人有更多,更好的链接添加,请随意。

此外,它很好,因为它有助于封装一点点,Button类知道的世界越少越好(反之亦然,没有详细说明,有人可以更好地解释这一点):

如果有人有更多,更好的链接添加,请随意。

此外,我一直在提及但不详细的内容,每个有一点经验的人都能理解事件,并且可以遵循它们。事件可能使代码难以理解新程序员,并且与具体的参考链接相比更难以遵循,但成本超过了好处。当我说观察者模式的标准化可能是其重要性的关键之一时,这就是我的意思。

告诉我你是否有意义。

答案 1 :(得分:1)

我为一切创造了自己的事件。比如说,我有一个Sprite,它有一个子Sprite。子Sprite根据颜色值数组一直在改变颜色。我想通知某些其他精灵,这个精灵现在是红色但我不知道它什么时候会发生,因为它是随机迭代颜色数组。子精灵可以在满足条件时触发事件,任何正在倾听的人都可以对此做出反应。

否则,每个需要知道Sprite红色的人都要问孩子,你是红色的,你是红色的,你是红色的吗?

答案 2 :(得分:1)

A post I made while back on custom events

自定义事件可让您更好地控制应用中的事件结构。也许最重要的是,与此操作或操作的语义相关性:XML已成功加载?点燃MyEvent.XML_LOAD_COMPLETE

正如我在帖子中详述的那样,您还可以扩展具有新功能的自定义事件,特别是在我的情况下,以处理触发事件旁边的额外数据。

这是非常方便的。

希望有所帮助

答案 3 :(得分:1)

当我需要在事件对象上存储更多信息时,我将创建自己的事件。这样,当我在侦听器中处理事件时,我可以访问所需的数据,而无需将其存储在event.target对象上。

作为旁注,我发现signals library可以更好地实现这一点。