这是AS3中的“好习惯”(关于使用盛大活动)吗?

时间:2013-01-04 17:51:40

标签: actionscript-3

首先,我要感谢您抽出宝贵时间阅读我的问题。 所以,我做了一个小小的flash游戏(真的不能把它称为游戏),无论如何,我正在检查是否有2个物体相互撞击。所以总结一下这里是代码

public function loop(e:Event):void
{
    y += vx;
    if(y > stageRef.stageHeight || y < 0)
        removeSelf();
    if(hitTestObject(target.hit))
    {
        removeSelf();
        stageRef.dispatchEvent(new GameOverEvent(GameOverEvent.DEAD)); // <--
        stageRef.addChild(new SmallImplosion(stageRef, x, y));
    }
}

所以,当它们碰撞时,一个对象发送一个事件,代码没有问题,它可以工作,但我想知道用这种方式处理它是否合适。 stageRef是舞台的引用,两个类都有它。

我的另一个类捕获了该事件并触发了一个函数,如下所示:

stageRef.addEventListener(GameOverEvent.DEAD, takeHit, false, 0, true);

问题是,这是处理它的好方法吗?提前谢谢!

2 个答案:

答案 0 :(得分:3)

当实现observer pattern时,每个参与对象都有一个明确的角色:一个是主体,谁是发生动作的对象,而另一个是观察者,他们监听事件。科目。在Flash中,当您将处理函数传递给subscribe-method时,任何对象都可以是观察者。然而,主题实现IEventDispatcher并提供订阅主题的必要方法。还有标准实现EventDispatcher已经实现了必要的方法(许多类型都是它的子类型)。

现在回到你的问题;你本质上是在引入第三方,即播放活动的舞台。你可以在全球舞台上调度它们,而不是让主题本身发送的主题是本地事件,所有观察者都必须听取舞台而不是主题本身。

这通常不是你应该做的。每个主题(IEventDispatcher)应该只调度自己的事件。就像您从单击的按钮收到单击事件一样,您将从触发它的对象中收到一个GameOverEvent。

答案 1 :(得分:0)

从名称GameOverEvent开始,我相信隐含着一点意义。由于游戏结束时有很多工作要做,我觉得你的舞台听这样的活动是合适的。

但是,请勿使用此技术来处理任何较小的系统。例如,如果碰撞只对玩家造成了一些伤害(我不知道这在游戏的背景下是否有意义,但在这里与我滚动)那么最好是让类检查碰撞和处理健康状况的类可以直接相互交互,而不是触发这些“ Grand Events ”。