as和fla之间的EventDispatcher?

时间:2010-03-25 15:04:19

标签: actionscript-3 mouseevent flash-cs3 event-dispatching

我正在Flash中制作一款格斗游戏,当我运行一切时,我错过了一些东西:胜利/失败的屏幕。从逻辑上讲,我知道该怎么做:

if character.hp < 0
{
    character.dead = true;
    dispatchevent("death", event)
}

我的问题是我不知道如何编码它。我知道我将使用两个类和两个.fla文件(除非我错了)。

我在这里有两个.fla文件:Menu.fla文件和Arena.fla文件。 Menu.fla包含游戏的整个导航,选项,角色选择屏幕等。当玩家参与战斗时,它会加载Arena.fla文件,其中只包含背景(取决于所选择的阶段)并且现在仅设置为一帧的长度。对于Arena.fla,实际操作发生在我的课程中,但从逻辑上讲,我只需要HP.asCharacter.as

Character.as中,我声明了以下变量:

var isDead:Boolean = false;    //is character dead?

HP.as中,相信我应该拥有以下内容:

if(currentHp<0)
{
    currentHp = 0;
    character.isDead = true;     //declared as var `character:Object;`
    EventDispatcher.dispatchEventListener("playerDead", playerDead);
}

最后,在Arena.fla中,我希望能够检测到上面提到的eventlistener,然后继续前进到第二帧,它将以“PLAYER ONE HAS WON”或“ PLAYER ONE已经失去了“一个按钮,可以让我回到角色选择屏幕。这是我陷入困境的第一部分:如何在主.fla文件中检测调度的事件监听器?

其次,如果玩家点击“CONTINUE”按钮,无论玩家是赢还是输,都会显示该按钮,我的Menu.fla(加载Arena.swf)如何检测此点击事件,卸载游戏,然后返回角色选择屏幕?

提前感谢您帮助我。我意识到这是很多文字,但它是我最具描述性的文字。如果您对我的问题有任何疑问或需要澄清,请随时说出来。

-Christopher

2 个答案:

答案 0 :(得分:1)

我不确定你必须阅读惠普的代码,但是你知道character.dead实际上是真的吗?

你总是可以让Arena.swf调用HP.as中的一个函数来结束游戏并声明一个胜利者。你可以向Arena.swf添加第二帧,其中包含一个暗淡的背景和一个WINNER或者LOSER text。'

通常,用户定义的类获得事件分派功能的最简单方法是扩展EventDispatcher。如果这是不可能的(也就是说,如果类已经扩展了另一个类),您可以改为实现IEventDispatcher接口,创建EventDispatcher成员,并编写简单的挂钩以将调用路由到聚合的EventDispatcher。

激活的 在Flash Player或AIR应用程序获得操作系统焦点并变为活动状态时调度。

停用的 在Flash Player或AIR应用程序失去操作系统焦点并变为非活动状态时调度。

Event dispatcher

答案 1 :(得分:0)

谢谢大家的帮助,但我已经弄明白了。事实证明,我的方法对于我想要做的事情来说太复杂了,而且我已经离开了。我将解释我是如何做到的。

我没有像我想的那样使用EventDispatcher,而是使用SharedObject,只是让一切都像魔术一样。

可以从应用程序/游戏中的任何位置访问SharedObject,只要它被正确引用即可。所以我只是在我的角色选择屏幕中创建了一个名为“winLossData”的SharedObject设置为“NO WINNERS”。此cookie永远不会保存也不会写入磁盘,因此用户无法找到它(一般来说)。

我决定使用包含所有控件的Movement.as类,并编写了一个Event.ENTER_FRAME类型的事件监听器,可以不断检查我的角色的健康状况。如果其中一个低于100,我的SharedObject立即取值为“PLAYER ONE”或“PLAYER TWO”,具体取决于谁获胜(即其健康点低于100) 。之后,为了预防,我将丢失角色的健康点重置为100.以下是代码:

    function whoWon(event:Event):void
    {
        if(playerSpriteBar.getPower() <= 0)
        {
            winner.data.winner = "Player Two";
            playerSpriteBar.update(100);
        }
        if(playerAIBar.getPower() <= 0)
        {
            winner.data.winner = "Player One";
            playerAIBar.update(100);
        }
    }

在我的Menu.fla中,我有另一个类型为Event.ENTER_FRAME的事件监听器,它等待cookie更改值。只要Cookie更改了值,Menu.fla会自动卸载外部swf(在我们的示例中为Arena.swf),并根据收到的SharedObject显示结果。其余的操作发生在Menu.fla文件中,因此不需要任何额外的编码。

再次感谢大家的帮助。