Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3-钢球超速_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 AS3-钢球超速

Actionscript 3 AS3-钢球超速,actionscript-3,flash,Actionscript 3,Flash,我正在用Flash Pro CS6制作一个小应用程序,我制作了这个球,它使用箭头键(使用代码Sippets)以每帧4像素的速度移动。问题是,每当我死了,我到了另一帧,我可以点击replay,然后再试一次,但这次,球的速度是8像素/帧,每次我重放游戏时,这个数字都会不断增加。有没有办法解决这个问题?以下是我正在使用的代码片段: var upPressed:Boolean = false; var downPressed:Boolean = false; var leftPressed:Boolea

我正在用Flash Pro CS6制作一个小应用程序,我制作了这个球,它使用箭头键(使用代码Sippets)以每帧4像素的速度移动。问题是,每当我死了,我到了另一帧,我可以点击replay,然后再试一次,但这次,球的速度是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;


    }
}
};

在我看来,每次你
gotoAndPlay
第一帧时,你都会创建一个新的ball实例,但是仍然有一个事件监听器附加到原始的一个,即使它从舞台上移除


因此,在每个新的ENTER_帧上,该方法不仅调用一次,而且对球的每个实例调用一次。解决方案是在“您死了”时删除事件侦听器,或者使用弱引用,以便可以干净地删除ball实例

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

ball
是舞台上的MovieClip实例名吗?是的,它是舞台上的MovieClip实例“解决方案是在“你死了”时删除事件侦听器,或者使用弱引用,以便可以干净地删除ball实例。”我对as3有点陌生,所以我还不知道弱引用是什么。
addEventListener
有一个可选的第三个参数,
weakReferences
。如果将其设置为
true
,则
ball
的实例将被正确地垃圾收集,即使侦听器仍然连接到对象。如果没有,则必须删除侦听器,以便将球从内存中删除。谢谢你的代码,现在电影更真实了。好的,在等待您的答复时,我添加了一个ball.removeEventListener(Event.ENTER\u FRAME,fl\u MoveInDirectionOfKey),这样现在就没有更多的错误了!