使用多个类来控制一个角色

Using multiple classes to control a character

我正在尝试创建虚拟 pet/basic 模拟人生类型的游戏。 我将使用独立的 class 文件并在主游戏文件中调用它们。 我正在尝试写一个 class 来控制我的角色,我可以将它添加到舞台上,但我不能让它移动。 我刚刚花了 4 个小时观看教程、阅读书籍,却看不出我错过了什么。 谁能给我一些建议让这个工作? 这是我的代码...

这是我的主要class ...

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);
        }

    }
}

这是角色 class ...

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;
            }
        }

    }
}

我已经将事件监听器移动到多个地方,但仍然无法正常工作。 我猜我遗漏了一些明显的东西,但无法弄清楚是什么!

您需要将 KeyboardEvent 监听器添加到舞台 - 目前只有当您的角色有文本焦点时它才会起作用,而它永远不会有。

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

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)