Actionscript 3 我应该在这里使用直接函数调用而不是事件处理程序吗?

Actionscript 3 我应该在这里使用直接函数调用而不是事件处理程序吗?,actionscript-3,flash,actionscript,Actionscript 3,Flash,Actionscript,我在Actionscript3工作,开发一款类似MMO的游戏,我负责UI,还有其他事情。我的很多工作流都使用事件,但我的合作伙伴建议我对UI资产使用直接函数调用。下面是一个例子: 我创建了一个ColorChooser类,我们用它来重新给用户化身的部分上色 单击颜色时,ColorChooser读取(彩色光谱图像)单击的像素并发送事件(ColorChooser.color\u selected) 我的虚拟设计师班级正在收听此事件 当事件被调度时,化身设计者中的处理程序事件读取(即目标为颜色选择器)。

我在Actionscript3工作,开发一款类似MMO的游戏,我负责UI,还有其他事情。我的很多工作流都使用事件,但我的合作伙伴建议我对UI资产使用直接函数调用。下面是一个例子:

  • 我创建了一个ColorChooser类,我们用它来重新给用户化身的部分上色
  • 单击颜色时,ColorChooser读取(彩色光谱图像)单击的像素并发送事件(ColorChooser.color\u selected
  • 我的虚拟设计师班级正在收听此事件
  • 当事件被调度时,化身设计者中的处理程序事件读取(即目标为颜色选择器)。选择颜色,并将该颜色应用于化身的选定部分
  • 我的搭档建议我:

  • 为其父对象(\u AvatarDesigner)的实例ColorChooser
  • 单击颜色时,读取单击的像素(var chosenColor:uint)并从颜色选择器对象中调用\u avatarDesigner.colorAvatar(chosenColor)
  • 现在,在我的大多数UI中,我都使用事件,这样我就可以将下拉菜单、按钮、文本区域等资产分开并可重用。我想我们将在其他方面(ObjectDesigner、WallperDesigner、BuildingDesigner)重复使用这个ColorChooser对象。他说,每次我将ColorChooser用于其他用途时,最好在ColorChooser中添加一个条件,因此可能类似于:

    private function colorClicked(e:MouseEvent):void {
        var chosenColor:uint = *the color chosen (bitmapdata.getpixel());*
        switch(parent){
            case AvatarDesigner:    (parent as AvatarDesigner).colorChosen(chosenColor); 
                                    break;
            case ObjectDesigner:    (parent as ObjectDesigner).colorChosen(chosenColor); 
                                    break;
            case WallpaperDesigner: (parent as WallpaperDesigner).colorChosen(chosenColor); 
                                    break;
            case BuildingDesigner:  (parent as BuildingDesigner).colorChosen(chosenColor); 
                                    break;
        }
    }
    
    或者类似的东西(可能不是检查父项,而是检查构造函数中的字符串“type”之类的东西)。这对我来说似乎很奇怪,因为每次在其他地方使用时,我都要回去加一个箱子。然而,对于事件,它可以触发它的事件,并处理或不处理它,而不管它的父对象是什么。他的一些理由是:

    • 事件只能用于异步事件或输入(鼠标、键盘)
    • 已调度事件和侦听器占用更多cpu
    • 直接函数调用更快,因为它是当前线程的一部分,而不是在稍微不同的时间进行调度和处理
    • Actionscript3和Away3D(用于3D)从不以这种方式使用事件
    鉴于我认为事件是适当的,原因如下:

    • 允许对象完全独立于其父对象,使其更易于重用
    • 我不认为调度的事件和侦听器会占用更多的CPU(例如,因为任何给定的精灵在任何给定的时间调度许多事件,如进入\u帧、鼠标\u出、添加到\u阶段),而看不到性能的影响
    • 如果在dispatchEvent之后侦听器中发生与顺序相关的任务,那么轻微的异步性并不重要
    • 我认为,在仔细研究了他们的API之后,Away3D确实以这种方式使用了它们
    有人能给这个照点光吗?每次我在不同类型的父级中使用此资产时,是否值得在新的逻辑条件下硬编码,比如“ShinyButton”?即使事件和侦听器正在使用CPU,添加这样的条件是否会让它有点像意大利面条

    此外,就我的一生而言,我找不到一个Actionscript3最佳实践来描述事件的好坏以及原因。另外,如果有人知道如何在低级别上使用事件,我也很乐意


    谢谢你的阅读

    我认为你的不同观点更多地是基于习惯而非真实原因

    我个人会使用个人事件模型,这是我心目中最开放、最灵活的解决方案

    但是,如果您想使用回调函数而不需要返回到
    ColorChooser
    ,您可以创建一个像
    icorReceiver
    这样的接口,并使用一个名为
    applyColor(color:color){}的必需方法(谈到编程最佳实践,您应该注意,方法名称更清晰,使用“applyColor”或“choseColor”等动词,而不是“colorselected”等形容词或名称,这并不意味着很多)

    然后在
    colorPicked(e:MouseEvent){}
    方法中,确保
    parent
    实现
    icorreceiver
    ,并调用
    applyColor(chosenColor)
    没有其他测试,只有带有
    ICorReceiver
    的测试。它也可以与经典继承一起工作,但需要更多的代码,灵活性就会降低

    我不提供代码,但您似乎有一个合理的级别,因此我有信心。;)


    (希望我的英语是正确的)

    我认为你的不同观点更多地是基于习惯而非真实原因

    我个人会使用个人事件模型,这是我心目中最开放、最灵活的解决方案

    但是,如果您想使用回调函数而不需要返回到
    ColorChooser
    ,您可以创建一个像
    icorReceiver
    这样的接口,并使用一个名为
    applyColor(color:color){}的必需方法(谈到编程最佳实践,您应该注意,方法名称更清晰,使用“applyColor”或“choseColor”等动词,而不是“colorselected”等形容词或名称,这并不意味着很多)

    然后在
    colorPicked(e:MouseEvent){}
    方法中,确保
    parent
    实现
    icorreceiver
    ,并调用
    applyColor(chosenColor)
    没有其他测试,只有带有
    ICorReceiver
    的测试。它也可以与经典继承一起工作,但需要更多的代码,灵活性就会降低

    我不提供代码,但您似乎有一个合理的级别,因此我有信心。;)


    (希望我的英语是正确的)

    简短的回答,我认为你是对的,你的朋友是错的。任何可感知的绩效收益(如有)