代码之家  ›  专栏  ›  技术社区  ›  Christopher Richa

AS和FLA之间的事件调度程序?

  •  0
  • Christopher Richa  · 技术社区  · 14 年前

    我正在用闪光灯做一个战斗游戏,当我所有的东西都在运行时,我错过了一些东西:一个胜利/失败的屏幕。从逻辑上讲,我知道怎么做:

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

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

    我有两个在这里播放的fla文件: Menu.fla 文件和 Arena.fla 文件。 菜单.fla 包含游戏的整个导航、选项、字符选择屏幕等。当玩家需要战斗时,它会加载 佛罗里达州竞技场 文件,它只包含背景(取决于所选阶段),目前只设置为一帧的长度。为了 佛罗里达州竞技场 真正的行动发生在我的课堂上,但从逻辑上讲,我只需要 HP.as Character.as .

    字符.as ,我声明了以下变量:

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

    HPAS ,相信我应该具备以下条件:

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

    最后,在 佛罗里达州竞技场 ,我想能够检测到上述事件监听器,只需移动到第二帧,该帧将以“玩家一赢得”或“玩家一失去”的样式显示消息,按钮将允许我返回字符选择屏幕。这是我陷入困境的第一部分:如何在主.fla文件中检测已调度的事件侦听器?

    第二,如果玩家点击“继续”按钮,无论玩家赢了还是输了,该怎么做? 菜单.fla (加载 Arena.swf )检测到这个点击事件,卸载游戏,然后返回字符选择屏幕?

    事先谢谢你帮助我。我知道这是很多文字,但它是我能描述的最具描述性的。如果您对我的问题有任何疑问或需要澄清,请随时发言。

    -克里斯托弗

    2 回复  |  直到 14 年前
        1
  •  1
  •   Jonathan Czitkovics    14 年前

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

    你可以一直拥有 Arena.swf 在hp.as中调用一个函数,该函数将结束游戏并声明一个胜利者。您可以在arena.swf中添加第二帧,该帧包含一个变暗的背景和一个胜利者或失败者文本。

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

    激活 当Flash播放器或Air应用程序获得操作系统焦点并激活时发送。

    停用 当flash播放器或air应用程序失去操作系统焦点并处于非活动状态时发送。

    Event dispatcher

        2
  •  0
  •   Christopher Richa    14 年前

    谢谢大家的帮助,但我已经想好了。结果证明,我的方法对于我想做的事情来说太复杂了,在我离开的时候。我会解释我是怎么做到的。

    而不是使用 EventDispatcher 就像我想的那样,我用了 SharedObject 让一切都像魔法一样运作。

    共享对象 可以从应用程序/游戏中的任何位置访问,只要它被正确地引用。所以我只是创造了一个 共享对象 名为“winlossdata”在“我的角色选择”屏幕中设置为“无赢家”。此cookie从未保存或写入磁盘,因此用户没有机会找到它(一般来说)。

    我决定用 Movement.as 类,该类包含我的所有控件并编写类型为的事件侦听器 Event.ENTER_FRAME 这经常检查我角色的健康状况。如果其中一个低于100,我的 共享对象 根据赢得者(即健康分数为 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 ,我有另一个类型的事件侦听器 事件.输入帧 等待cookie更改值。一旦cookie改变了值, 菜单.fla 自动卸载外部SWF(在我们的情况下, Arena.swf )并根据收到的结果显示结果 共享对象 . 其余的动作发生在 菜单.fla 文件,所以不需要任何额外的编码。

    再次感谢大家的帮助。

    推荐文章