AS3动画在第1帧停止

时间:2013-02-18 01:35:38

标签: actionscript-3 flash animation actionscript

我是AS3的新手,我曾经在AS2编码,但一年多以来我不使用Flash或ActionScript。 我的问题是,当我按下左边或右边的箭头时,将角色向右移动,左边的动画就停在第一帧。空闲动画工作正常,但每次按下按钮时,步行动画在第1帧开始和停止。

vector.gotoAndPlay("parado");

var leftKeyDown:Boolean = false;
var rightKeyDown:Boolean = false;
var mainSpeed:Number = 7;

vector.addEventListener(Event.ENTER_FRAME, moveChar);
function moveChar(event:Event):void{

    if(leftKeyDown){
        if(vector.currentLabel!="andando"){
            vector.x -= mainSpeed;
            vector.scaleX=-1;
            vector.gotoAndPlay("andando");
        }
    } else {
        if(rightKeyDown){
            if(vector.currentLabel!="andando") {
                vector.x += mainSpeed;
                vector.scaleX=1;
                vector.gotoAndPlay("andando");
            }
        }
    }
}

stage.addEventListener(KeyboardEvent.KEY_DOWN, checkKeysDown);
function checkKeysDown(event:KeyboardEvent):void{

    if(event.keyCode == 37){
        leftKeyDown = true;
    }

    if(event.keyCode == 39){
        rightKeyDown = true;
    }
    }
    stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
    function checkKeysUp(event:KeyboardEvent):void{

    if(event.keyCode == 37){
        leftKeyDown = false;
    }
    if(event.keyCode == 39){
        rightKeyDown = false;
    }
}

仅供参考:“parado”是我的空闲动画,“andando”是我的漫步动画。

1 个答案:

答案 0 :(得分:3)

它不是在第1帧停止,它只是一直被送回第1帧。考虑当您按住按钮几秒钟时会发生什么:

  • rightKeyDown以false开头。该分支中没有代码被执行。

  • 用户按住右箭头,rightKeyDown变为真

  • moverChar检查rightKeyDown,看到它是真的并将该字符发送到“andando”。

  • moveChar再次运行,看到rightKeyDown为真,但角色仍处于“andando”框架,因此它什么也没做。

  • 字符在“andando”之后进入框架。

  • moverChar运行,rightKeyDown仍然是正确的,但框架不再处于“andando”,因此它会重置为它。

并且在用户按住键的所有时间内重复,因此它似乎卡在第1帧和第2帧中

解决此问题的几种方法:


仅在用户按下或释放按钮时更改关键帧,而不是在每个帧之间更改关键帧。

function moveChar(event:Event):void{

    if(leftKeyDown){
        vector.x -= mainSpeed;
        // No frame checks or frame changes here.
    }
    [...]

function checkKeysDown(event:KeyboardEvent):void{
    if(event.keyCode == 37){
        leftKeyDown = true;
        vector.scaleX=-1;
        vector.gotoAndPlay("andando");
        // Send the character to the correct frame when the user presses the key.
    }
    [...]

function checkKeysUp(event:KeyboardEvent):void{
    if(event.keyCode == 37){
        leftKeyDown = false;
        vector.gotoAndPlay("parado");
        // Send it back to idle when the user releases the key.
    }
    [...]

另一种选择是将每个动画单独存储在动画片段中,并将它们放入容器动画片段中。因此,角色的符号中只有两个帧,一个用于空闲动画,另一个用于步行动画。在您的代码中,您使用的是gotoAndStop而不是gotoAndPlay,因此无论每帧都调用它都无关紧要。


编辑:还尝试对条件进行分组。

} else {
    if(rightKeyDown){
        if(vector.currentLabel!="andando") {
            vector.x += mainSpeed;
            vector.scaleX=1;
            vector.gotoAndPlay("andando");
        }
    }
}

可以改写为

} else if (rightKeyDown && vector.currentLabel != "andando"){
    vector.x += mainSpeed;
    vector.scaleX=1;
    vector.gotoAndPlay("andando");
}