Déplacer un dessin avec les flèches du clavier en ActionScript 3 (AS3)
Nous allons utiliser pour gérer le déplacement d'un objet, la classe KeyboardEvent. Nous verrons ici l'événement keyDown (l'appui sur une touche).
Dans la fonction qui sera exécutée en réponse de l'événement, nous allons tester le code de la touche du clavier afin de définir les différentes interactions à réaliser.
-
// Objet de dessin
-
var rectangle:Sprite = new Sprite();
-
// Remplissage du rectangle avec du bleu
-
rectangle.graphics.beginFill(0x0000FF);
-
// Dessin du rectangle
-
rectangle.graphics.drawRect(50, 200, 100, 30);
-
// Déplacement du rectangle à la souris
-
function deplacement(evt:KeyboardEvent):void
-
{
-
// Test de la touche utilisée
-
switch(evt.keyCode)
-
{
-
// déplacement vers la gauche
-
case Keyboard.LEFT:
-
evt.target.x-=5;
-
break;
-
// déplacement vers le haut
-
case Keyboard.UP:
-
evt.target.y-=5;
-
break;
-
// déplacement vers la droite
-
case Keyboard.RIGHT:
-
evt.target.x+=5;
-
break;
-
// déplacement vers le bas
-
case Keyboard.DOWN:
-
evt.target.y+=5;
-
break;
-
// pas de déplacement
-
default :
-
evt.target.x+=0;
-
}
-
}
-
// Affichage du rectangle
-
this.addChild(rectangle);
-
// Focus sur le rectangle pour qu'il puisse être actif
-
stage.stageFocusRect = false; // Le rectangle jaune du focus est supprimé pour tous les objets
-
stage.focus = rectangle;
-
// Ecouteur de l'événement keyDown sur le rectangle
-
rectangle.addEventListener(KeyboardEvent.KEY_DOWN, deplacement);
;)
Je suis Antony Chauviré, développeur sur la Flash Platform.
Hello :)
tu devrais utiliser la classe flash.ui.Keyboard pour énumérer les touches du clavier :) (plus besoin de commenter ton code du coup dans les 'case' )
Exemple : Keyboard.LEFT, Keyboard.RIGHT, etc...
EKA+ :)
Salut,
J'ajoute à cela que ton default ne sert à rien du tout :D pourquoi le mettre ?
@++
Merci EKA
Il va falloir que je m'habitue au constante moi ! ;)
thecaptain : même si le default ne sert pas, il est indiqué dans la doc qu'il doit être inclus donc je préfère le mettre.
"All switch statements should include a default case that will execute if none of the case statements match the expression"
@+
Hello :)
Oui.. moi aussi je mets tjs le default par habitude avec un trace() ou parfois je le place en prévision mais je met aucun code dedans :)
A mon avis à ce niveau là c'est une question de choix dans le code.
EKA+ :)
Salut y a un truc qui marche pas c'est quand on appuis sur deux touches en même temps pour aller en diagonale ça prend en compte que la dernière touche enfoncer et pas les deux je me demande comment on peut faire vous avez une idée pour allez en diagonal ?
J'apprends l'AS3 grâce à ce site et je rends un hommage appuyé à Tannoy qui par la clarté de ses tutoriels m'a fait découvrir sans déplaisir un langage dont la complexité et la richesse me laissent imaginer des développements de grande qualité dans le futur (je promets de faire désormais des phrases courtes)
Je ne comprends pas la remarque d'Ekameleon (qui est pourtant mon "Dieu" en AS2 puis 3). Les constantes sont en en anglais etn'apporteraient pas plus de clarté au code. Mais, comme je suis certain qu'il doit avoir raison, (cf réponse de tannoy) pourrait-on avoir un exemple de la solution proposée et une explication de ses avantages ?
Merci pinacolada.
Pour répondre à ta question, il est plus lisible d'utiliser les constantes Keyboard.LEFT ou Keyboard.RIGHT que les codes de touches 37 et 39.
C'est pourquoi ekameleon me faisait la remarque et me disait qu'en utilisant les constantes, on pouvait se passer des commentaires //deplacement vers la gauche.
J'ai donc modifié mon code et utilisé les constantes tout en gardant les commentaires pour encore faciliter la compréhension.
Réponse impressionnante de rapidité (20 minutes) !
Le code actuel est le code corrigé : je comprends pourquoi je le trouvais si beau...
PS : Ok. J'en fais trop. Fin des compliments.
Question suivante (Quoi ? J'exagère ?) : Comment faites-vous pour "découvrir" tout celà ? Existe-t-il déjà une doc en français en ligne quelque part ?
Bizarre ce serveur, je viens juste de recevoir la notification du commentaire datant du 06 décembre.
Il n'existe pas de doc en français mais la doc anglaise est en ligne :
livedocs.macromedia.com/f...
@+
Très bien comme exemple mais si on clique sur l' animation ou qu' on l' ouvre avec firefox le rectangle reste figé.
Il arrive parfois que evt.keyCode ne renvoit pas de valeur à cause de l'IME (voir documentation Adobe)
Il est préférable d'ajouter ceci avant le switch :
/* Vérifie si présence d'IME (éditeur de méthode d'entrée) car les touches peuvent ne pas être renvoyées dans ce cas */
if (Capabilities.hasIME) {
IME.enabled = false;
}
Bonsoir,
J'aimerai savoir sur quel objet devons nous placer l'écouteur si l'on veux vérifier qu'une touche est appuyée (par exemple la touche A).
En effet j'ai un clip appelé scène contenant tout le reste, je met l'écouteur sur celui ci mais apparemment il n'exécute pas ma fonction lorsque j'appuie.
Auriez vous un simple exemple ?
Ps : j'utilise des classes ^^