【问题标题】:Encapsulate an action so that it can be performed from a mouse event OR an animation OR some event ending封装一个动作,以便它可以从鼠标事件或动画或某些事件结束时执行
【发布时间】:2026-01-20 03:50:02
【问题描述】:

我经常有一个对鼠标事件(例如,MouseEvent.CLICK)执行的函数/动作,必须移动到:

  • 发生在动画内部(在给定的帧标签处)
  • 发生在某个事件中(例如,Event.COMPLETE)
  • 当另一个项目被添加到舞台或从舞台上移除时发生

封装此类活动的最佳 OOP 方法是什么,这样我就不会不断地重写我的代码?

顺便说一句,我还应该提到这个函数也从一个显示对象移动到另一个显示对象,而不是它正在侦听的唯一事件......

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    您可以将事件处理程序设置为采用这样的单个参数:

    protected function actionHandler(e:Event = null):void {
        //handler code here.
    }
    

    然后,您可以通过 MouseEvent、任何扩展 Event 的东西来引用它,或者在它不是事件驱动的情况下调用它而不提供参数。在处理程序中测试 e 的类型(或者如果 e 为 null)可以让您更精确地控制在特定情况下要做什么。

    只要处理程序没有真正被用来针对那些不同的事件/情况做两件完全不同的事情,这应该没问题;但是,如果您真的在处理程序中对操作进行分支,则应该使用多个事件处理程序来创建更易于维护的代码。

    【讨论】:

      【解决方案2】:

      请原谅,但我不明白您所说的必须将功能从一个显示对象移动到另一个显示对象

      据我了解,您也希望在其他事件(如您指定的事件)期间使用鼠标单击事件/功能,而不管它被调用的位置。

      如果是这种情况,并且如您所说,该函数要经常使用,我会说将其设为静态函数。

      【讨论】:

      • 我应该澄清一下...假设我有一个动作在用户单击显示对象 A 时触发。但是然后...假设客户端决定应该将相同的动作移至当显示对象 B 上的动画完成时...封装这些动作以进行此类更改的最佳方式是什么?
      【解决方案3】:

      如果几个对象共享共同的功能,你可以创建一个抽象类,你的对象可以继承。

      公共类 MyDisplayObjectAbstract 扩展了 MovieClip { 受保护的函数 mouseEventListener(event:Event):void { gotoAndStop('frameLabel') } 受保护的函数完成事件侦听器(事件:事件):无效 { //做任何事 } }

      然后您可以将您的对象链接到如下所示的类,并在必要时覆盖某些函数

      公共类 ObjectOne 扩展 MyDisplayObjectAbstract { 覆盖受保护的函数 mouseEventListener(event:Event):void { //做任何事 } }

      【讨论】:

        最近更新 更多