使用多个类来控制角色

时间:2015-01-03 23:15:08

标签: actionscript-3 actionscript

我正在尝试创建一个虚拟宠物/基本模拟人生型游戏。 我将使用独立的类文件并在主游戏文件中调用它们。 我正在尝试写一个班来控制我的角色,我可以将它添加到舞台上,但是不能让我的生活让它移动。 我花了4个小时观看教程,看书,却看不到我错过的东西。 有人能为我提供一些建议吗? 这是我的代码......

这是我的主要班级......

package {

    import flash.display.MovieClip;
    import MainCharacter;
    import flash.events.KeyboardEvent;

    public class Tamagotchi extends MovieClip {

        public function Tamagotchi() {
            var item:MainCharacter = new MainCharacter();
            addChild(item);
            item.addEventListener(KeyboardEvent.KEY_DOWN, item.KeyPressListener);
        }

    }
}

这是角色类...

package {

    import flash.display.MovieClip;
    import flash.events.KeyboardEvent;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class MainCharacter extends MovieClip {

        var soph: MovieClip = new SophRun;

        public function MainCharacter() {
            addChild(soph);
            soph.x = 200;
            soph.y = 300;      
            soph.addEventListener(KeyboardEvent.KEY_DOWN, KeyPressListener);
        }

        public function KeyPressListener(e:KeyboardEvent):void {
            if (e.keyCode == 65)
            {
                soph.x -= 2;
            }
            if (e.keyCode == 68)
            {
                soph.x += 2;
            }
            if (e.keyCode == 87)
            {
                soph.y -= 2;
            }
            if (e.keyCode == 83)
            {
                soph.y += 2;
            }
        }

    }
}

我已将eventlistener移动到多个地方但仍无法使其正常工作。 我猜我错过了一些明显的东西,但无法弄清楚是什么!

1 个答案:

答案 0 :(得分:2)

你需要将KeyboardEvent监听器添加到舞台上 - 目前它只有在你的角色具有文字焦点时才有效,这是不会有的。

我喜欢的一个简单的设置,它有一个Input类,它添加了必要的事件监听器,然后你可以用来检查是否按下了键。类似的东西:

public class Input
{
    // handy constants for common keys
    public static const A:int = 65;
    public static const B:int = 66;
    ...
    public static const LEFT:int = 37;
    public static const UP:int = 38;
    public static const RIGHT:int = 39;
    public static const DOWN:int = 40;

    private var m_keysPressed:Vector.<Boolean> = null; // the keys currently pressed

    public function Input( stage:Stage )
    {
        // we create our vector for the max number of keys that we're going to support (standard keyboard)
        this.m_keysPressed = new Vector.<Boolean>( 225, true );

        // add our listeners
        stage.addEventListener( KeyboardEvent.KEY_DOWN, this._onKeyDown );
        stage.addEventListener( KeyboardEvent.KEY_UP, this._onKeyUp );
    }

    public function isKeyPressed( key:int ):Boolean
    {
        if( key < 0 || key >= this.m_keysPressed.length )
            return false;
        return this.m_keysPressed[key];
    }

    private function _onKeyDown( e:KeyboardEvent ):void

        this.m_keysPressed[e.keyCode] = true;
    }

    private function _onKeyUp( e:KeyboardEvent ):void
    {
        this.m_keysPressed[e.keyCode] = false;
    }
}

这样,您的所有输入代码都是中心。然后您可以通过以下方式调用它:

if( myInput.isKeyPressed( Input.UP ) )
    // move up

好处:

  • 您的代码是核心 - 易于更改
  • 易于禁用或启用(暂停功能)
  • 您可以添加简单的回调(Dictionary int键和Function值)
  • 您可以轻松添加justPressed( key )justReleased( key )等方法
  • 您没有遇到重复键的问题(当按住某个键时,Flash会重复KEY_DOWN事件)

如果您计划在移动设备上使用此功能,则可能需要为_onKeyDown()_onKeyUp()功能添加边界检查,因为Android Home和Back键具有愚蠢的高keyCode

注意:如果它仍然不起作用,请确保您已经给予舞台焦点(即点击它),并且您不在TextField等(stage.focus = null