Actionscript 3 使用多个类控制角色

Actionscript 3 使用多个类控制角色,actionscript-3,actionscript,Actionscript 3,Actionscript,我正在尝试创建一个虚拟宠物/基本模拟人生类型的游戏。 我将使用独立的类文件,并在主游戏文件中调用它们。 我试图写一个类来控制我的角色,我可以把它添加到舞台上,但我的一生都无法让它移动。 我只花了4个小时看教程,阅读书籍,只是看不到我错过了什么。 有谁能给我一些建议,让这个工作? 这是我的密码 这是我的主课 package { import flash.display.MovieClip; import MainCharacter; import flash.events

我正在尝试创建一个虚拟宠物/基本模拟人生类型的游戏。 我将使用独立的类文件,并在主游戏文件中调用它们。 我试图写一个类来控制我的角色,我可以把它添加到舞台上,但我的一生都无法让它移动。 我只花了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;
            }
        }

    }
}
这是角色类

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移动到多个位置,但仍然无法使其工作。
我猜我遗漏了一些明显的东西,但我不知道是什么

您需要将
键盘事件
侦听器添加到舞台-目前,它仅在您的角色具有文本焦点时才起作用,而文本焦点永远不会起作用

我喜欢一个简单的设置,它有一个
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;
    }
}
好处:

  • 您的代码是中心的-易于更改
  • 易于禁用或启用(暂停功能)
  • 您可以添加简单的回调(
    Dictionary
    带有
    int
    键和
    Function
    值)
  • 您可以轻松添加方法,如
    justPressed(key)
    justrelease(key)
  • 您不会遇到重复按键的问题(当按下按键时,Flash将重复
    key\u down
    事件)
如果您计划在移动设备上使用此功能,您可能需要为
\u onKeyDown()
\u onKeyUp()
函数添加边界检查,因为Android Home和Back键的
键值非常高


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

有趣的项目中-除了下面的答案之外,您是否正在创建
Tamagotchi
的实例并将其添加到阶段?要养成习惯的一件事是,当你想检查是否有事情发生时,使用
trace()
语句作为诊断——关键事件等。触发等。此外,如果有你以前没有使用过的方法和函数,请制作快速测试影片——从中学习,然后应用到你的项目中。是的,我可以在舞台上找到角色,但仍然无法让它移动!我被难住了。我尝试过使用实例名称,在开始时使用
。this
,甚至在开始时使用
阶段。
。没有什么。没什么。我只是不明白。是的,我在keyPressListener函数中添加了一个跟踪语句,但仍然没有任何结果。它快把我逼疯了!说实话,这让我很困惑!我真的是一个新手,这是很多代码,我甚至还没有学会,并没有完全理解。我想理解并使用代码,如果只是复制你给我看的东西,我会觉得自己像个骗子,但我真的很感激。当我完全理解它时,我将保留它以备将来参考。:)基本上,它是在做你正在做的事情,除了它在一个专门的课程中,简化了你的生活。您只需调用
isKeyPressed(key)
,而无需到处添加事件侦听器。一般来说,一个事件监听器位于中心位置优于多个事件监听器(您可以使用
Update
类对输入帧事件遵循相同的原则)。这些方便的常量可以在键盘类中找到。