我是编程新手,我一直在检查很多游戏编码教程。我注意到,在大多数情况下,他们使用自定义事件来触发方法,而不是直接调用方法。
这种做法背后的原因是什么?为什么他们不只是调用方法?
例如:
我们有两个对象:A
和B
。 A
有A.methodA()
方法,B
在触发X
条件时需要使用该方法B
。
为什么要实施:
A
向A
发送一个事件,告诉A.methodA()
运行B
而不是:
A.methodA()
使用{{1}}
答案 0 :(得分:14)
主要原因是利益分离。使用事件时,A类不需要知道B类的存在(反之亦然)。
这样做的一些好处是:
答案 1 :(得分:2)
通常在较大的应用程序中使用事件将有助于抽象一切。如果你有15个以上的类并且它们都是对控制器的ditpatching事件,那么通过读取代码的所有不同部分来跟踪函数,找出正在发生的事情要容易得多。使用回调开始创建意大利面条代码。
但是,直接函数调用将比事件执行得更快。
答案 2 :(得分:1)
就个人而言,我使用自定义事件只是为了方便使用。我可以让一个类在事件发生时调度事件(例如动画完成或下载中发生错误),并且任何数量的其他类根据该事件运行任意数量的其他函数。另外,我编写了可重用性代码。每个类的目标是完全独立,因此它可以在任何项目中运行而无需其他包。因此,我不是让一个类调用另一个类的方法,而是从第二个类侦听的第一个类中调度一个事件,然后运行该方法。然后当我需要第一个类用于另一个项目时,我可以复制/粘贴它而不必修改它而不会丢失任何功能。
编辑: 此外,值得注意的是,有时候人们会按照你所描述的方式来处理事件参数。
假设您在舞台上有一个按钮,您需要能够单击它,但您还需要能够手动调用该方法。有些人没有意识到你可以传入一个null事件并且只有一个方法。或者您可以将其设置为空的默认参数,请参阅下文:
private function onClickHandler( e:MouseEvent = null ):void{
//as long as you never reference "e" within this method, this method can be used both for MouseEvent listeners and manually calling it elsewhere in the code
}
该技术可以帮助避免使用仅调用另一个方法的事件处理程序而不是其他方法。在我的编程中,我编写的每个AS3事件处理程序都默认将event参数设置为null。它只是让以后更容易。
答案 3 :(得分:1)
另请注意,使用回调方法可以直接将参数传递给它,而不是通过自定义事件模型。
答案 4 :(得分:0)
我构建了自己的,非常简化的事件调度程序系统。 AS事件模型非常强大,但在99%的情况下,您不需要这种能力。将参数作为事件触发的简单回调绰绰有余。您仍然可以保留事件模型的多功能性,但不需要编写太多代码行,比如简单的按钮。 我可以设置一个这样的简单事件:
Buttonizer.autoButton(_buttQuit, this, "onPress");
public function onPressQuit(c:Sprite) {
// Execution goes here
}
您可以构建自己的事件模型,它可以简化生活,使代码更简洁。