0

我正在用 Flash Pro CS6 制作一个小应用程序,我制作了这个球,它使用箭头键(使用 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 上,该方法不仅被调用一次,而且为球的每个实例调用一次。解决方法是在“你死了”的时候移除事件监听器,或者使用弱引用,这样就可以干净地移除球实例。

顺便说一句,这是您脚本的简短版本 - 不需要所有这些 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 回答