title: Code Konami sous Flex
date: 2012-03-20
tags: Flex, geekeries
url: codekonami
slug: codekonami
**Article (encore) mis à jour avec un _vrai_ exemple.**
**Article mis à jour avec une solution un rien plus propre.**
Petit bout de code permettant d'intercepter le "code konami" et d'exécuter une méthode dans une application Flex (code ActionScript 3).
**DISCLAIMER : ce bout de code n'est pas un tutoriel, et sera à adapter en fonction des besoins.**
Dans la classe désirée (celle qui contient l'application par exemple) :
private var keys:Array = [];
private var seq:String = "38,38,40,40,37,39,37,39,66,65";
Dans l'appel lors du CreationComplete :
this.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown, false, 0, true);
puis :
private function onKeyDown(event:KeyboardEvent):void
{
keys.push(event.keyCode);
if(keys.join(',').indexOf(seq)>=0)
{
Alert.show("Code konami");
keys = [];
}
}
Origine du code (en javascript) :
**Mise à jour :**
Utiliser un tableau, c'est bien, mais si l'utilisateur saisit une très longue phrase, ou son chat s'amuse avec le clavier,le tableau va s'étendre à l'infini,l'application risquera de planter (mémoire insuffisante), même si avec des machines avec beaucoup de mémoire vive, ça risque de prendre du temps avant de planter…
La séquence tient sur 0xA codes clavier. L'astuce est simple : on ne stocke que les 10 derniers codes claviers dans le tableau.
Concrètement, au niveau algo, ça serait quelque chose du genre « si la longueur du tableau est supérieure à 10 éléments, alors on enlève le premier élément du tableau, puis on ajoute le nouveau à la fin. »
Modification du code :
private function onKeyDown(event:KeyboardEvent):void
{
if(keys.length > 9)
keys.shift();
keys.push(event.keyCode);
if(keys.join(',') == seq)
{
Alert.show("Code konami");
keys = [];
}
}
La méthode "shift" retourne (et retire) le premier élément du tableau.
Avec cette modification toute simple, le tableau ne dépassera pas 10 éléments.
Accessoirement, la comparaison avec la chaîne de caractères contenant le code des touches est simplifiée ; au lieu de chercher la présence de cette chaîne à l'intérieur du tableau, on la compare directement.
Exemple (Ne pas oublier de cliquer dedans pour donner le focus au plugin flash) :
Code source :
Archive zip :
Concernant le code source, j'ai fait le choix d'utiliser un de mes templates (pour faire de vraies RIA) et pas créer un mxml « hello world » comme on en trouve par milliers, et ce, pour une raison simple : un hello world montre que le code compile dans un cas simple. Quand on code des applications avec des centaines de classes, on n'est plus dans le même domaine, et les exemples montrent vite leurs limites (en fait, ça ne marche pas si on est en pur AS3).
.