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);
问题是,这是处理它的好方法吗?提前谢谢!
答案 0 :(得分:3)
当实现observer pattern时,每个参与对象都有一个明确的角色:一个是主体,谁是发生动作的对象,而另一个是观察者,他们监听事件。科目。在Flash中,当您将处理函数传递给subscribe-method时,任何对象都可以是观察者。然而,主题实现IEventDispatcher并提供订阅主题的必要方法。还有标准实现EventDispatcher已经实现了必要的方法(许多类型都是它的子类型)。
现在回到你的问题;你本质上是在引入第三方,即播放活动的舞台。你可以在全球舞台上调度它们,而不是让主题本身发送的主题是本地事件,所有观察者都必须听取舞台而不是主题本身。
这通常不是你应该做的。每个主题(IEventDispatcher)应该只调度自己的事件。就像您从单击的按钮收到单击事件一样,您将从触发它的对象中收到一个GameOverEvent。
答案 1 :(得分:0)
从名称GameOverEvent
开始,我相信隐含着一点意义。由于游戏结束时有很多工作要做,我觉得你的舞台听这样的活动是合适的。
但是,请勿使用此技术来处理任何较小的系统。例如,如果碰撞只对玩家造成了一些伤害(我不知道这在游戏的背景下是否有意义,但在这里与我滚动)那么最好是让类检查碰撞和处理健康状况的类可以直接相互交互,而不是触发这些“ Grand Events ”。