【问题标题】:EventDispatcher between an as and an fla?as和fla之间的EventDispatcher?
【发布时间】:2023-03-17 00:57:02
【问题描述】:

我正在用 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,我希望能够检测到上述事件监听器并简单地移动到第二帧,它将显示一条消息,风格为“PLAYER ONE HAS WON”或“PLAYER ONE” HAS LOST”带有一个按钮,可以让我返回角色选择屏幕。这是我卡住的第一部分:如何在我的主 .fla 文件中检测调度的事件侦听器?

其次,如果玩家点击“CONTINUE”按钮,无论玩家输赢都会显示,我的Menu.fla(加载Arena.swf)如何检测到这个点击事件,卸载游戏,并返回角色选择界面?

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

-克里斯托弗

【问题讨论】:

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


    【解决方案1】:

    我不确定您必须阅读 HP 的代码,但您知道 character.dead 实际上正在变为真的吗?

    您始终可以让Arena.swf 调用 HP.as 中的函数,这将结束游戏并宣布获胜者。您可以将第二个 Frame 添加到 Arena.swf,其中包含暗色背景和 WINNER 或 LOSER 文本.'

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

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

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

    Event dispatcher

    【讨论】:

    • 感谢您的帮助,这让我找到了正确的方向。
    【解决方案2】:

    感谢大家的帮助,但我已经想通了。事实证明,对于我想做的事情以及我离开的时间来说,我的方法太复杂了。我会解释我是怎么做到的。

    我没有像我想的那样使用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 文件中,因此无需任何额外编码。

    再次感谢大家的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多