1

首先,我要感谢您花时间阅读我的问题。所以,我制作了一个小 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);

问题是,这是处理它的好方法吗?先感谢您!

4

2 回答 2

3

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

现在回到你的问题;您实际上是在引入第三方,即广播事件的舞台。不是将主题本地的事件分发到主题本身,而是将它们分发到全局舞台上,并且所有观察者都必须收听舞台而不是主题本身。

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

于 2013-01-04T18:07:15.353 回答
0

从名字GameOverEvent上,我相信暗示了一点意义。因为在比赛结束时有很多事情要做,所以我觉得在你的舞台上听这样的事件是合适的。

但是,不要使用这种技术来处理任何较小的系统。例如,如果碰撞只对玩家造成了一些伤害(我不知道这在你的游戏环境中是否有意义,但在这里和我一起滚动)那么最好让类检查碰撞和处理健康的类直接相互交互,而不是触发这些“大事件”。

于 2013-01-04T18:01:07.457 回答