2015-03-15 1 views
0

"player" est un objet qui se déplace vers le haut, le bas, la gauche et la droite lorsque j'appuie sur les touches fléchées. "Player" ne se déplace pas en diagonale lorsque j'appuie sur les touches vers le haut et les touches gauche ou d'autres touches quelconques. J'utilise Adobe Flash CS5 et le script d'action 3 (As3). Pouvez-vous me dire quelle est la solution?pourquoi ce code ne détecte-t-il pas le mouvement diagonal?

stage.addEventListener(KeyboardEvent.KEY_DOWN, detectText);  
function detectText(myevent:KeyboardEvent):void { 
     var up:Boolean = false; 
     var down:Boolean = false; 
     var left:Boolean = false; 
     var right:Boolean = false; 
     var speedOfplayer:Number = 5 ; 
if (myevent.keyCode==39){ 
    right = true ; 


} 

if (myevent.keyCode==37){ 
    left = true ; 
} 

if (myevent.keyCode==38){ 
    up = true ;      

} 

if (myevent.keyCode==40){ 
    down = true ; 
} 
      // if(right is true and left is not true) 
      if(right && !left) { 
       player.x = player.x + speedOfplayer; 
      } 
      // if(up is true and down is not true) 
      if(up && !down) { 
       player.y = player.y - speedOfplayer;   
      } 
      // if(down is true and up is not true) 
      if(down && !up) { 
       player.y = player.y + speedOfplayer; 
      } 
      // if(down is true and up is not true) 
      if(left && !right) { 
       player.x = player.x - speedOfplayer; 

      } 


      // Move diagonally 
      if(left && up && !right && !down) { 
       player.y = player.y - speedOfplayer;   
       player.x = player.x - speedOfplayer; 

      } 
      if(right && up && !left && !down) { 
       player.x = player.x + speedOfplayer; 
       player.y = player.y - speedOfplayer;   

      } 
      if(left && down && !right && !up) { 
       player.x = player.x - speedOfplayer; 
       player.y = player.y - speedOfplayer;   
      } 
      if(right && down && !left && !up) { 
       player.x = player.x + speedOfplayer; 
       player.y = player.y + speedOfplayer; 

      } 

Répondre

3

Vous risquez d'être trop compliqué. Cela peut être fait de la manière suivante. Qu'est-ce qui se passe à l'écouteur KEY_DOWN est qu'il rapportera la dernière touche enfoncée. Vous avez donc besoin d'un écouteur ENTER_FRAME pour déplacer l'objet. Et parce que ENTER_FRAME va continuer à appeler la fonction à condition que vous devez capturer si une touche est relâchée pour réinitialiser la vitesse du joueur à 0.

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); 
stage.addEventListener(Event.ENTER_FRAME, onTick); 

var speedX:uint = 0; 
var speedY:uint = 0; 

function onKeyDown(event:KeyboardEvent):void { 
    var key:uint= event.keyCode; 

    if (key == Keyboard.UP) { 
     speedY = -5; 
    } 
    if (key == Keyboard.DOWN) { 
     speedY = 5;  
    } 
    if (key == Keyboard.LEFT) { 
     speedX = -5; 
    } 
    if (key == Keyboard.RIGHT) { 
     speedX = 5; 
    } 
} 

function onKeyUp(event:KeyboardEvent):void { 
    var key:uint= event.keyCode; 
    if (key == Keyboard.UP || key == Keyboard.DOWN) { 
     speedY = 0; 
    } 
    if (key == Keyboard.LEFT || key == Keyboard.RIGHT) { 
     speedX = 0; 
    } 
} 

function onTick(event:Event):void { 
    player.x += speedX; 
    player.y += speedY; 
} 
+0

Merci beaucoup pour votre réponse, je voudrais vous poser quelques questions , – user2824371

+0

J'ai fait quelques modifications dans votre code parce que: les variables speedX et speedY sont uInt qui doivent avoir des valeurs positives seulement, et elles sont égales à cinq dans les instructions IF. donc, je les ai convertis en: Nombre. "onTick" dans l'écouteur d'événements n'est pas "_on Tick" dans la fonction. J'ai également déclaré la variable "Key" avant la fonction "onKeyDown" parce qu'elle a une erreur. puis, après la fonction, j'ai écrit le code suivant: key = event.keyCode; – user2824371

+0

Après mon édition, lorsque j'appuie sur "CTRL + Entrée" pour le tester. l'objet "player" se déplace en diagonale vers le bas et vers la droite (sans appuyer sur aucune touche) lorsque j'appuie sur les touches fléchées, il écoute les instructions. mais quand je relâche toutes les touches, il se déplace de nouveau dans le sens de la libération (haut ou bas ou droite ou levée). Pourriez-vous s'il vous plaît me donner un coup de main? – user2824371