繁体   English   中英

AS3-实例功能问题

[英]AS3 - Issues with functions of instances

我有三个正在使用的类,为了便于阅读已将其缩短,省去了包装和进口。 MainClass是我的文档类, Player是连接到一个影片剪辑的类,并且KeyHandler是一类我使用包含我的按键的功能。 首先,代码

public class  TestMain extends Sprite
{
    public var keyHandler:KeyHandler = new KeyHandler();
    public var timer:Timer = new Timer(30);
    public var player:Player = new Player();

    public function TestMain()
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
        timer.addEventListener(TimerEvent.TIMER, onTick);
        timer.start();

        stage.addChild(player);
    }

    public function onTick(timerEvent:TimerEvent)
    {
        player.Move();
    }
}

播放器类

public class Player extends Sprite
{
    public var keyHandler:KeyHandler = new KeyHandler();

    public function Player()
    {
    }

    public function Move():void
    {
        trace("this works");
        if (keyHandler.upKeyIsPressed)
        {
            trace("this doesnt work")
        }
    }

}

KeyHandler类..

public class KeyHandler extends Sprite
{
    public var upKeyIsPressed:Boolean = false;

    public function KeyHandler() 
    {
    }

    public function KeyPress(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = true;
        }
    }

    public function KeyRelease(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = false;
        }
    }

}

按住向上键不会跟踪任何内容,但是Move功能可以。 我应该将KeyHandler静态,还是有一个简单的解决方法? 这是不好的做法吗?

这是我评论中的选项1

TestMain

public class  TestMain extends Sprite
{
    public var keyHandler:KeyHandler = new KeyHandler();
    public var timer:Timer = new Timer(30);
    public var player:Player = new Player();

    public function TestMain()
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
        timer.addEventListener(TimerEvent.TIMER, onTick);
        timer.start();
        player.keyHandler = keyHandler;
        stage.addChild(player);
    }

    public function onTick(timerEvent:TimerEvent)
    {
        player.Move();
    }
}

播放器

public class Player extends Sprite
{
    public var keyHandler:KeyHandler;

    public function Player()
    {
    }

    public function Move():void
    {
        trace("this works");
        if (keyHandler.upKeyIsPressed)
        {
            trace("this should be working now")
        }
    }

}

密钥处理程序

public class KeyHandler extends Sprite
{
    public var upKeyIsPressed:Boolean = false;

    public function KeyHandler() 
    {
    }

    public function KeyPress(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = true;
        }
    }

    public function KeyRelease(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = false;
        }
    }

}

选项2进行“ Singleton”类型的设置,您可以通过静态方法获取该类的实例。 在这种情况下,整个类仅使用一个实例,不需要将实例传递给本身实际上不需要其句柄的对象。 在我对OP的评论中的链接中,我讨论了用于强制执行模式的选项,因此不会意外生成新实例,我只是在这里使用一个简单的选项,它会导致运行时错误:

public class KeyHandler extends Sprite
{
    public var upKeyIsPressed:Boolean = false;
    public static var SINGLETON:KeyHandler = new KeyHandler();
    public static function getInstance():KeyHandler
    {
        return SINGLETON;
    }

    public function KeyHandler() 
    {
        if(SINGLETON)
            throw new Error("There can be only one!!!");
    }

    public function KeyPress(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = true;
        }
    }

    public function KeyRelease(keyboardEvent:KeyboardEvent)
    {
        if (keyboardEvent.keyCode == Keyboard.UP)
        {
            upKeyIsPressed = false;
        }
    }

}

播放器

public class Player extends Sprite
{
    public var keyHandler:KeyHandler = KeyHandler.getInstance();

    public function Player()
    {
    }

    public function Move():void
    {
        trace("this works");
        if (keyHandler.upKeyIsPressed)
        {
            trace("this should be working now")
        }
    }

}

TestMain

public class  TestMain extends Sprite
{
    public var keyHandler:KeyHandler = KeyHandler.getInstance();
    public var timer:Timer = new Timer(30);
    public var player:Player = new Player();

    public function TestMain()
    {
        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyHandler.KeyPress);
        stage.addEventListener(KeyboardEvent.KEY_UP, keyHandler.KeyRelease);
        timer.addEventListener(TimerEvent.TIMER, onTick);
        timer.start();
        player.keyHandler = keyHandler;
        stage.addChild(player);
    }

    public function onTick(timerEvent:TimerEvent)
    {
        player.Move();
    }
}

这是强制执行Singleton的另一种方法,该方法会导致编译时错误,因此您可以在前面看到问题:

http://blog.pixelbreaker.com/actionscript-3-0/as30-better-singletons

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM