as3中移动时的行走动画

发布于 2025-01-06 05:14:31 字数 1935 浏览 4 评论 0原文

好吧,我有一个影片剪辑实例为“男人”,我制作了他,这样他就有了像这样的空闲和行走框架。他还可以向左/向右移动。 (我也让他攻击,但这无关紧要);

[闲置][行走] 最后一帧

gotoAndPlay("walk");

我需要它循环遍历“行走”帧,直到我抬起左/右键然后返回到“空闲”位置。发生的情况是,即使我没有抬起钥匙,它也会经历一次循环,然后进入空闲状态。这是我的代码

      var leftKeyDown:Boolean = false;
        var upKeyDown:Boolean = false;
        var rightKeyDown:Boolean = false;
        var downKeyDown:Boolean = false;
        var charSpeed:Number = 7;
        man.addEventListener(Event.ENTER_FRAME, moveChar);
    function moveChar(event:Event):void{
    if(leftKeyDown || rightKeyDown)
{
    man.gotoAndPlay("walk");
}


if(rightKeyDown)
{
    man.x += charSpeed;
    man.scaleX=1;
}
if(leftKeyDown)
{
    man.x -= charSpeed;
    man.scaleX=-1;
}

            }


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

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


            }

            if(event.keyCode == 38 || event.keyCode == 87){
                upKeyDown = true;
            }
            if(event.keyCode == 39 || event.keyCode == 68){
                rightKeyDown = true;
                    }
            if(event.keyCode == 40 || event.keyCode == 83){
                downKeyDown = true;
            }

        }



        // checking for upkeys
     stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
function checkKeysUp(event:KeyboardEvent):void{
    if(event.keyCode == 37 || event.keyCode == 65){
        leftKeyDown = false;
        man.gotoAndStop("idle");
    }
    if(event.keyCode == 38 || event.keyCode == 87){
        upKeyDown = false;

    }
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = false;
        man.gotoAndStop("idle");
    }
    if(event.keyCode == 40 || event.keyCode == 83){
        downKeyDown = false;

    }
}

谢谢

Ok so i have an movie clip instanced as "man" I have made him so that he has a Idle and Walk frame like this. He can also move left/right. (I also made him attack but that is irrelevant);

[Idle][walk []
The last frame has

gotoAndPlay("walk");

I need it to loop through the "walk" frames until i lift up the left/right key then go back to "idle" position. What happens is that it will go through the loop once and than go to idle even if I haven't lifted the key. This is my code

      var leftKeyDown:Boolean = false;
        var upKeyDown:Boolean = false;
        var rightKeyDown:Boolean = false;
        var downKeyDown:Boolean = false;
        var charSpeed:Number = 7;
        man.addEventListener(Event.ENTER_FRAME, moveChar);
    function moveChar(event:Event):void{
    if(leftKeyDown || rightKeyDown)
{
    man.gotoAndPlay("walk");
}


if(rightKeyDown)
{
    man.x += charSpeed;
    man.scaleX=1;
}
if(leftKeyDown)
{
    man.x -= charSpeed;
    man.scaleX=-1;
}

            }


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

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


            }

            if(event.keyCode == 38 || event.keyCode == 87){
                upKeyDown = true;
            }
            if(event.keyCode == 39 || event.keyCode == 68){
                rightKeyDown = true;
                    }
            if(event.keyCode == 40 || event.keyCode == 83){
                downKeyDown = true;
            }

        }



        // checking for upkeys
     stage.addEventListener(KeyboardEvent.KEY_UP, checkKeysUp);
function checkKeysUp(event:KeyboardEvent):void{
    if(event.keyCode == 37 || event.keyCode == 65){
        leftKeyDown = false;
        man.gotoAndStop("idle");
    }
    if(event.keyCode == 38 || event.keyCode == 87){
        upKeyDown = false;

    }
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = false;
        man.gotoAndStop("idle");
    }
    if(event.keyCode == 40 || event.keyCode == 83){
        downKeyDown = false;

    }
}

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如日中天 2025-01-13 05:14:31

只要在 if 语句通过后退出该函数,如果其他一切都失败,则该函数处于空闲状态。

if(leftKeyDown){
    man.x -= charSpeed;
    man.scaleX=-1;
    man.gotoAndPlay("walk");
    return;
}
if(rightKeyDown){
    man.x += charSpeed;
    man.scaleX=1;
    man.gotoAndPlay("walk");
    return;
}

 man.gotoAndStop("idle");

或者如果你想要另一个方面

switch(true){
  case leftKeyDow:
        man.x -= charSpeed;
        man.scaleX=-1;
        man.gotoAndPlay("walk");
        break;
  case rightKeyDown:
        man.x += charSpeed;
        man.scaleX=1;
        man.gotoAndPlay("walk");
        break;
  default:
        man.gotoAndStop("idle");
}

Just exit out of the function after an if statement passes and if all else fails it is idle.

if(leftKeyDown){
    man.x -= charSpeed;
    man.scaleX=-1;
    man.gotoAndPlay("walk");
    return;
}
if(rightKeyDown){
    man.x += charSpeed;
    man.scaleX=1;
    man.gotoAndPlay("walk");
    return;
}

 man.gotoAndStop("idle");

or if you want another aspect

switch(true){
  case leftKeyDow:
        man.x -= charSpeed;
        man.scaleX=-1;
        man.gotoAndPlay("walk");
        break;
  case rightKeyDown:
        man.x += charSpeed;
        man.scaleX=1;
        man.gotoAndPlay("walk");
        break;
  default:
        man.gotoAndStop("idle");
}
巷雨优美回忆 2025-01-13 05:14:31

尝试使用位块传送。这里有一些网站可以学习如何做到这一点。

http://www.gotoandlearn.com/play.php?id=140 <- 这是一个很好的!

http://www.gotoandlearn.com/play.php?id=147

http://www.adobe.com/devnet/flash/articles/blitting_mc.html

http://blog.flexwiz.net/spritesheet-animation-in-as3/

您还可以使用TexturePacker 来创建blit/sprite 表。

http://www.texturepacker.com/

我在很多项目中使用过它,它节省了大量时间

Try using bliting. Here are some sites to learn how to do it.

http://www.gotoandlearn.com/play.php?id=140 <- this is a good one!

http://www.gotoandlearn.com/play.php?id=147

http://www.adobe.com/devnet/flash/articles/blitting_mc.html

http://blog.flexwiz.net/spritesheet-animation-in-as3/

You could also use TexturePacker to create your blit/sprite sheets.

http://www.texturepacker.com/

I have used it on many projects and it saves tons of time

最单纯的乌龟 2025-01-13 05:14:31

我看到的一个问题是你的 if/else 语句。

目前,如果你的右键是向上的,无论你的左键是否按下,都会调用空闲动画。它需要更改为类似的内容:

if(leftKeyDown || rightKeyDown)
{
    man.gotoAndPlay("walk");
}
else
{
    man.gotoAndStop("idle");
}

if(rightKeyDown)
{
    man.x += charSpeed;
    man.scaleX=1;
}
if(leftKeyDown)
{
    man.x -= charSpeed;
    man.scaleX=-1;
}

另外,请确保在步行和空闲动画结束时的动画循环中有一个 stop(); 调用,以防止它一直播放。

One problem I see is your if/else statements.

Currently, if your right key is up, regardless of if your left key is down, the idle animation will be called. It needs to be changed to something like:

if(leftKeyDown || rightKeyDown)
{
    man.gotoAndPlay("walk");
}
else
{
    man.gotoAndStop("idle");
}

if(rightKeyDown)
{
    man.x += charSpeed;
    man.scaleX=1;
}
if(leftKeyDown)
{
    man.x -= charSpeed;
    man.scaleX=-1;
}

Also make sure you have a stop(); call in your animation loop at the end of the walk and idle animations to prevent it playing all the way through.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文