通过类AS3将事件侦听器添加到全局阶段

时间:2011-05-24 19:50:55

标签: actionscript-3 class

我正在制作一个简单的游戏,我希望能够在类构造函数中添加键盘事件lisnter。但是我遇到了麻烦。我不知道你必须通过列出的显示对象属性阶段传递舞台吗?无论如何,我得到的错误无法识别我的事件监听器键盘事件。

最佳路易斯

   package louiseguchi.game
{
    import flash.display.Stage;
    import flash.events.Event;
    import flash.display.Sprite;
    import flash.ui.Keyboard
    import flash.events.KeyboardEvent



    {

        public function keyBoardVelocity extends EventDispatcher ()
        {
            // constructor code

            stage.addEventListener(KeyboardEvent.KEY_UP, keyPressUp);

        }
        private static function keyPressUp(Event:KeyboardEvent):void{
            trace("ok")
        }

    }

}

2 个答案:

答案 0 :(得分:2)

您可以创建一个具有公共静态属性的类,您可以为其分配舞台引用,从而使整个应用程序可以访问舞台,如下所示:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            GlobalVars.stage = stage;

            var keyboardVelocity:KeyboardVelocity = new KeyboardVelocity();

        }// end function

    }// end class

}// end package 

import flash.display.Stage;

internal class GlobalVars
{
    public static var stage:Stage;

}// end class

import flash.events.EventDispatcher;
import flash.events.KeyboardEvent;

internal class KeyboardVelocity extends EventDispatcher
{
    public function KeyboardVelocity()
    {
        var stage:Stage = GlobalVars.stage;

        stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);

    }// end function

    private function onStageKeyDown(e:KeyboardEvent):void   
    {
        trace("key down");

    }// end function

}// end class

注意:我使用了内部类,因此您只需将代码复制并粘贴到文档类中并运行它即可。理想情况下,您可以将类分隔为自己的文件。

就我个人而言,我不喜欢在全球范围内使用对象,因为它会带来潜在的安全风险,在我看来这是不好的做法。您应该考虑简单地将舞台的引用解析为KeyboardVelocity类,如下所示:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var keyboardVelocity:KeyboardVelocity = new KeyboardVelocity(stage);

        }// end function

    }// end class

}// end package 

import flash.display.Stage;
import flash.events.EventDispatcher;
import flash.events.KeyboardEvent;

internal class KeyboardVelocity extends EventDispatcher
{
    public function KeyboardVelocity(stage:Stage)
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, onStageKeyDown);

    }// end function

    private function onStageKeyDown(e:KeyboardEvent):void   
    {
        trace("key down");

    }// end function

}// end class

答案 1 :(得分:1)

这里有一些问题。首先,你的班级是畸形的。看我的评论。

  package louiseguchi.game
    {
        import Main; //doc class
        import flash.display.Stage;
        import flash.events.Event;
        import flash.display.Sprite;
        import flash.events.EventDispatcher;
        import flash.ui.Keyboard
        import flash.events.KeyboardEvent

//only classes may be extended
        public class KeyBoardVelocity extends EventDispatcher
        {

    //here is your constructor
            public function KeyBoardVelocity()
            {
                super()
                init()
            }

            private function init():void
            {
                addEventHandlers();
            }


            private function addEventHandlers()
            {
//static access of main stage
                Main.stage.addEventListener(KeyboardEvent.KEY_UP, keyPressUp);
            }

            // instance function
            private function keyPressUp(Event:KeyboardEvent):void{
                trace("ok")
            }

        }

    }

请注意,我在构造函数和侦听器之间添加了几个步骤。如果你愿意,可以这样做,但我通常很少在构造函数中。

其次,您需要在显示列表中有一些对象来访问该阶段,并且通常通过Main文档类访问它。在这里,我只有一个在文档类中引用的静态get函数:

package com.b99.testBed //alter as needed
{
    import com.b99.testBed.keypress.KeyBoardVelocity;
    import flash.display.Sprite;
    import flash.display.Stage;

    /**
     * ...
     * @author bosworth99
     */
    public class Main extends Sprite
    {
        private static var _stage:Stage;

        public function Main() 
        {
            super();
            init();
        }

        private function init():void
        {
            _stage = this.stage;

            var _candidate:KeyBoardVelocity = new KeyBoardVelocity();

        }

        public static function get stage():Stage { return _stage; }

    }

}

您可以通过多种方式访问​​舞台,这是我通常喜欢的方式。

希望有所帮助。