0

我真的是 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”是我的行走动画。

4

1 回答 1

3

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

  • rightKeyDown开始为假。该分支中没有代码被执行。

  • 用户持有右箭头,rightKeyDown变为真

  • moverChar检查rightKeyDown,发现它是真的,并将角色发送到“andando”。

  • moveChar再次运行,seesrightKeyDown是真的,但角色仍然在“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");
}
于 2013-02-18T03:59:31.200 回答