0

私はFlashProCS6で小さなアプリを作成しており、矢印キー(Code Sippetsを使用して作成)を使用してフレームあたり4ピクセルの速度で移動するこのボールを作成しました。問題は、死ぬたびに別のフレームに到達してリプレイを押してゲームを再試行できることですが、今回はボールの速度が8ピクセル/フレームであり、ゲームをリプレイするたびにこの数値が増加し続けます。それを修正する方法はありますか?これが私が使用しているスニペットです:

var upPressed:Boolean = false;
var downPressed:Boolean = false;
var leftPressed:Boolean = false;
var rightPressed:Boolean = false;

ball.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey); //I think the problem might be this "Enter Frame"
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);

function fl_MoveInDirectionOfKey(event:Event)
{
if (upPressed)
{
    ball.y -=  4;
}
if (downPressed)
{
    ball.y +=  4;
}
if (leftPressed)
{
    ball.x -=  4;
}
if (rightPressed)
{
    ball.x +=  4;
}
}

function fl_SetKeyPressed(event:KeyboardEvent):void
{
switch (event.keyCode)
{
    case Keyboard.UP :
        {
            upPressed = true;
            break;


        };
    case Keyboard.DOWN :
        {
            downPressed = true;
            break;


        };
    case Keyboard.LEFT :
        {
            leftPressed = true;
            break;


        };
    case Keyboard.RIGHT :
        {
            rightPressed = true;
            break;


    }
}
};

function fl_UnsetKeyPressed(event:KeyboardEvent):void
{
switch (event.keyCode)
{
    case Keyboard.UP :
        {
            upPressed = false;
            break;


        };
    case Keyboard.DOWN :
        {
            downPressed = false;
            break;


        };
    case Keyboard.LEFT :
        {
            leftPressed = false;
            break;


        };
    case Keyboard.RIGHT :
        {
            rightPressed = false;
            break;


    }
}
};
4

1 に答える 1

1

私の見方では、最初のフレームごとに新しいボールインスタンスを作成しますgotoAndPlayが、ステージから削除された後でも、元のボールインスタンスに接続されたイベントリスナーがあります。

したがって、新しいENTER_FRAMEごとに、メソッドは1回だけでなく、ボールのインスタンスごとに1回呼び出されます。解決策は、「死んだ」ときにイベントリスナーを削除するか、弱参照を使用して、ボールインスタンスをきれいに削除できるようにすることです。

ところで、これはスクリプトの短いバージョンです。これらすべてのifステートメントとswitchステートメント、およびインスタンス変数は必要ありません。

var keyPressed:int = -1;
ball.addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);

function fl_SetKeyPressed(event:KeyboardEvent):void {
    keyPressed = event.keyCode;
}

function fl_UnsetKeyPressed(event:KeyboardEvent):void {
    keyPressed = -1;
}

function fl_MoveInDirectionOfKey(event:Event) {
    ball.y += keyPressed == Keyboard.UP ? -4 : keyPressed == Keyboard.DOWN ? 4 : 0;
    ball.x += keyPressed == Keyboard.LEFT ? -4 : keyPressed == Keyboard.RIGHT ? 4 : 0;
}
于 2012-05-26T17:25:05.013 に答える