Actionscript 3 这是不是;“良好做法”;在AS3中要做什么(关于使用大型活动)?

Actionscript 3 这是不是;“良好做法”;在AS3中要做什么(关于使用大型活动)?,actionscript-3,Actionscript 3,首先,我要感谢你花时间阅读我的问题。 所以,我做了一个小的flash游戏(不能称之为游戏),不管怎样,在某一点上,我正在检查两个物体是否相互碰撞。总而言之,这里是代码 public function loop(e:Event):void { y += vx; if(y > stageRef.stageHeight || y < 0) removeSelf(); if(hitTestObject(target.hit)) {

首先,我要感谢你花时间阅读我的问题。 所以,我做了一个小的flash游戏(不能称之为游戏),不管怎样,在某一点上,我正在检查两个物体是否相互碰撞。总而言之,这里是代码

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));
    }
}

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

从名称
GameOverEvent
,我相信其中隐含了一点意义。因为在比赛结束时有很多事情要做,我觉得在你的舞台上聆听这样的事件是合适的

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

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

现在回到你的问题;你本质上是在引入第三方,也就是播放事件的舞台。你不是在主题本身上调度主题本地的事件,而是在全局舞台上调度它们,所有观察者都必须听舞台而不是主题本身


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

谢谢您让它更清晰一点,正如您所看到的,我还是一个初学者。如果你不介意的话,你能告诉我,对于较小的系统,最好使用哪种方法让它们“直接交互”(我知道没有“最佳”方法,但我想听听你的意见)。这在很大程度上取决于你如何构建系统,但是,使用“造成损害”示例:假设您有一个类
CollisionHandler
,它在每一帧检查所有冲突条件,然后发送有关如何处理这些冲突的说明。现在让我们假设您的玩家信息存储在一个名为
player
的类中,并且您已经用名称
plyr
初始化和实例。与
CollisionHandler
调度事件并提供
plyr
和事件侦听器相比,在
CollisionHandler
中存储对
plyr
的引用并直接修改
plyr
的数据将更为有效。我真的不想惹人烦,但请再回答我一件事。这是否意味着我应该使用plyr.functionName()?再次非常感谢你!是的!在最后一条评论中,我已经用光了空间:PThanks,通过使用事件侦听器处理它是一个好方法,还是调用classname.functionName();更好?你的意思是让受试者直接呼叫实际在听的对象?不,我不认为那样更好。观察者模式允许松散耦合,因此主体不一定知道什么对象在听它。任何感兴趣的对象都应该开始听它,这样只有听者知道主题,而不是相反。
stageRef.addEventListener(GameOverEvent.DEAD, takeHit, false, 0, true);