2012-02-17 2 views
0

Ok, donc j'ai un clip instancié comme "man" Je l'ai fait pour qu'il ait un cadre Idle and Walk comme ça. Il peut aussi bouger à gauche/droite. (Je l'ai également fait attaquer mais ce n'est pas pertinent);Animation en marchant tout en bougeant as3

[Idle] [walk [] Le dernier cadre a

gotoAndPlay("walk"); 

j'ai besoin de boucle à travers les « marcher » cadres jusqu'à ce que je lève la gauche/touche droite puis revenir à « inactif » position. Ce qui se passe, c'est qu'il passera une fois dans la boucle et passera au ralenti même si je n'ai pas levé la clé. Ceci est mon 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; 

    } 
} 

grâce

Répondre

2

Quittez simplement la fonction après le passage d'une instruction if et si tout échoue, elle est inactive.

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"); 

ou si vous voulez un autre 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"); 
} 
+0

il va au cadre « marcher », mais ne joue pas plus tard. – thor625

+0

cela fonctionne si je fais jouer(); mais j'ai besoin que ce soit gottoAndPlay(); parce que je dois aussi faire une animation d'attaque – thor625

+0

Ce problème n'est pas lié à cette question. –

0

Essayez d'utiliser bliting. Voici quelques sites pour apprendre à le faire.

http://www.gotoandlearn.com/play.php?id=140< - c'est un bon!

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/

Vous pouvez également utiliser TexturePacker pour créer vos feuilles blit/sprites.

http://www.texturepacker.com/

Je l'ai utilisé sur de nombreux projets et il permet d'économiser des tonnes de temps

+0

je travaille ne pense pas que cela est tout à fait nécessaire – thor625

0

Un problème que je vois est votre if/else.

Actuellement, si votre touche droite est en haut, peu importe si votre touche gauche est enfoncée, l'animation inactive sera appelée. Il faut changer quelque chose comme:

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; 
} 

Assurez-vous également que vous avez un appel stop(); dans votre boucle d'animation à la fin de la marche et des animations ralenti pour l'empêcher de jouer tout au long.

+0

toujours pas – thor625