1

私が使用している 3 つのクラスがあり、読みやすくするために短縮し、パッケージとインポートを省略しています。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必要がありますか、それとも簡単な修正がありますか? これは悪い習慣ですか?

4

1 に答える 1

0

これは私のコメントのオプション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")
        }
    }

}

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

}

オプション2は、静的メソッドを介してクラスのインスタンスを取得する「シングルトン」タイプのセットアップを作成することです。この場合、クラスの1つのインスタンスのみが使用され、実際にハンドルを必要としないオブジェクトを介してインスタンスを渡す必要はありません。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();
    }
}

コンパイル時エラーの原因となるシングルトンを強制する別の方法を次に示します。これにより、問題が早期に発生します。

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

于 2012-06-15T00:23:15.093 に答える