2010-02-12 9 views
2

Je suis un débutant en programmation Flash Actionscript 3.0. J'essaye de créer des commandes de clavier lisses pour le mouvement du joueur dans un jeu. J'utilise actuellement addEventListener (KeyboardEvent.KEY_DOWN) en écoutant une touche du clavier, puis dans la fonction de gestionnaire déplacer un graphique en ajoutant un numéro à sa propriété .x ou .y.Dans Flash Actionscript 3.0, comment créer des commandes de clavier fluides pour le mouvement du joueur?

Cela crée un réflexe lent et lent au début. Je sais qu'il y a une façon plus souple et plus réactive de le faire, mais je n'ai aucune idée par où commencer. Toute aide serait appréciée!

Répondre

0

Où placez-vous l'auditeur? Est-ce dans l'application, ou dans l'image-objet qui est censée bouger? L'image-objet a-t-elle le focus lorsque vous appuyez sur la touche?

Également, en ajoutant l'écouteur d'événement, utilisez-vous la capture? Cela est, êtes-vous mise en 3ème argument vrai, comme dans

addEventListener(KeyboardEvent.KEY_DOWN, yourHandler, true) 

Si vous utilisez la capture, ce qui est de savoir comment vous devez le faire si l'application elle-même est à l'écoute de l'événement, alors vous obtiendrez un certain quantité de latence, et cette latence sera d'autant plus grande que l'interface est complexe. Si ces événements doivent gravir une vaste hiérarchie, cela pourrait être perceptible. S'il y a beaucoup de sprites, cela peut exacerber le problème.

Ce que vous pouvez faire est de faire en sorte que l'image-objet qui a le focus envoie un événement personnalisé auquel une classe de contrôleur écoute pour chaque image-objet. La classe de contrôleur aura un gestionnaire qui déplace le event.currentTarget mais vous prévoyez de le faire.

En outre lire sur les événements personnalisés et comment utiliser le SystemManager pour ajouter et supprimer des écouteurs de façon dynamique: http://livedocs.adobe.com/flex/3/langref/index.html.

2

Pour les touches lisses, je suggère d'utiliser soit un Timer ou onEnterFrame pour interroger les touches assez souvent pour obtenir des commandes en douceur. Il fera le travail, mais à un certain coût. Si vous avez le reste de la logique tout va bien, cela devrait correspondre ok:

var key:int = NaN; 

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPress,false,0,true); 
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyRelease,false,0,true); 
this.addEventListener(Event.ENTER_FRAME,update,false,0,true); 

function onKeyPress(event:KeyboardEvent):void { 
    key = event.keyCode; 
    event.stopPropagation(); 
} 
function onKeyRelease(event:KeyboardEvent):void { 
    key = NaN; 
    event.stopPropagation(); 
} 
function update(event:Event):void{ 
    if(key) trace(key); 
} 

Je fais que l'événement ne bouillonne pas en arrêtant c'est la propagation, et il est mis sur la scène qui devrait être le niveau le plus élevé, l'événement sage. Aussi j'utilise la clé seule la clé est en panne, sinon je l'ignore dans le gestionnaire enterFrame.

HTH, George

+2

Faites ceci. Pour être clair, le problème avec la version du questionneur est que vous ne bougez que lorsqu'une touche est enfoncée, donc elle bouge une fois lorsque vous appuyez sur la touche, puis ne bouge plus que lorsque le système d'exploitation commence à émettre des événements répétés clé étant maintenue. Vous ne voulez pas que le personnage bouge * quand * une touche est enfoncée, vous voulez qu'il bouge sur les mises à jour * pendant que * une touche est pressée, donc le mouvement devrait avoir lieu dans un gestionnaire ENTER_FRAME, pas un manipulateur keypress. – fenomas

0

l'exemple le plus simple à ce serait cela.
vous avez ici une classe de navire contrôlable (Ship.as).

import flash.display.MovieClip; 
import flash.events.KeyboardEvent; 
import flash.events.Event; 

public class Ship extends MovieClip { 

    private var speedX; 
    private var speedY; 

    public function Ship() { 
     //constructor 
     stage.addEventListener(KeyboardEvent.KEY_DOWN ,keyDown); 
     stage.addEventListener(KeyboardEvent.KEY_UP ,keyUp); 
     stage.addEventListener(Event.ENTER_FRAME, update); 
    } 

    public function keyDown(e:KeyboardEvent) { 
     if(e.keyCode == 37) { 
      speedX = -5; 
     } 
     if(e.keyCode == 38) { 
      speedY = -5; 
     } 
     if(e.keyCode == 39) { 
      speedX = 5; 
     } 
     if(e.keyCode == 40) { 
      speedY = 5; 
     } 
    } 

    public function keyUp(e:KeyboardEvent) { 
     if(e.keyCode == 37 || e.keyCode == 39) { 
      speedX = 0; 
     } 
     if(e.keyCode == 38 || e.keyCode == 40) { 
      speedY = 0; 
     } 
    } 

    public function update(e:Event) { 
     x += speedX; 
     y += speedY; 
    } 

}