2009-10-09 9 views
35

Quelle serait la meilleure façon d'implémenter le code konami dans une application flexible?code konami en flex

Je veux créer un composant pour l'ajouter à tous mes projets, juste pour m'amuser.

grâce

MISE À JOUR: Je fait un composant simple, grâce à ZaBlanc

<?xml version="1.0" encoding="utf-8"?> 
<mx:UIComponent xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Metadata> 
     [Event(name="success", type="flash.events.Event")] 
    </mx:Metadata> 
    <mx:Script> 
     <![CDATA[ 

      // up-up-down-down-left-right-left-right-B-A 
      public static const KONAMI_CODE:String = "UUDDLRLRBA"; 

      // signature 
      private var signatureKeySequence:String = ""; 

      private function init():void{ 
       systemManager.stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
      } 

      private function onKeyDown(event:KeyboardEvent):void{ 
       var keyCode:int = event.keyCode; 

       switch (keyCode) { 
        case Keyboard.UP: 
         signatureKeySequence += "U"; 
         break; 

        case Keyboard.DOWN: 
         signatureKeySequence += "D"; 
         break; 

        case Keyboard.LEFT: 
         signatureKeySequence += "L"; 
         break; 

        case Keyboard.RIGHT: 
         signatureKeySequence += "R"; 
         break; 

        case 66: //Keyboard.B only for AIR :/ 
         signatureKeySequence += "B"; 
         break; 

        case 65: //Keyboard.A only for AIR too :(
         signatureKeySequence += "A"; 
         break; 

        default: 
         signatureKeySequence = ""; 
         break; 
       } 

       // crop sequence 
       signatureKeySequence = signatureKeySequence.substr(0, KONAMI_CODE.length); 

       // check for konami code 
       if (signatureKeySequence == KONAMI_CODE) { 
        dispatchEvent(new Event("success")); 
        signatureKeySequence = ""; 
       } 

      } 
     ]]> 
    </mx:Script> 

</mx:UIComponent> 

pour le tester

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:konamicode="konamicode.*"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
     ]]> 
    </mx:Script> 
    <konamicode:KonamiCodeCatch success="Alert.show('+30 lives!!!')" /> 
</mx:Application> 

Répondre

26

Une machine d'état est amusant à écrire, mais dans ce cas je partirais avec un modèle de signature. Selon l'endroit où vous voulez mettre le gestionnaire (sur la scène du composant), voici un code qui devrait fonctionner, mais vous pouvez probablement le serrer (et bien sûr le personnaliser à votre besoin spécifique):

// up-up-down-down-left-right-left-right-B-A 
public static const KONAMI_CODE:String = "UUDDLRLRBA"; 

// signature 
private var signatureKeySequence:String = ""; 

private function onKeyDown(event:KeyboardEvent):void { 
    var keyCode:int = event.keyCode; 

    switch (keyCode) { 
     case Keyboard.UP: 
      signatureKeySequence += "U"; 
      break; 

     case Keyboard.DOWN: 
      signatureKeySequence += "D"; 
      break; 

     case Keyboard.LEFT: 
      signatureKeySequence += "L"; 
      break; 

     case Keyboard.RIGHT: 
      signatureKeySequence += "R"; 
      break; 

     case Keyboard.B: 
      signatureKeySequence += "B"; 
      break; 

     case Keyboard.A: 
      signatureKeySequence += "A"; 
      break; 

     default: 
      signatureKeySequence = ""; 
      break; 
    } 

    // crop sequence 
    signatureKeySequence = signatureKeySequence.substr(0, KONAMI_CODE.length); 

    // check for konami code 
    if (signatureKeySequence == KONAMI_CODE) { 
     // 30 lives! 
    } 
} 
+1

Juste ajouter un peu de manipulation pour "B" et "A" et ce sera le billet. – fenomas

+0

merci cela a bien fonctionné, malade poster mon composant plus tard pour le public intéressé – sergiogx

+0

Oups, vous avez raison. J'ai raté le BA. :-) OK, vous obtenez le jist! Je vais ajouter. – ZaBlanc

7

Vous pouvez utiliser Casalib. Il existe des classes, Key et KeyCombo. Vous pouvez écouter KeyComboEvent.SEQUENCE.

échantillon de travail:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init();"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 

      import org.casalib.events.KeyComboEvent; 
      import org.casalib.ui.Key; 
      import org.casalib.ui.KeyCombo; 
      import org.casalib.util.StageReference; 

      private const KONAMI_CODE:KeyCombo = new KeyCombo([Keyboard.UP,Keyboard.UP,Keyboard.DOWN,Keyboard.DOWN,Keyboard.LEFT,Keyboard.RIGHT,Keyboard.LEFT,Keyboard.RIGHT,("B").charCodeAt(),("A").charCodeAt()]); 

      private function init():void { 
       StageReference.setStage(this.systemManager.stage); 

       Key.getInstance().addKeyCombo(KONAMI_CODE); 
       Key.getInstance().addEventListener(KeyComboEvent.SEQUENCE,onKonami); 
      } 

      private function onKonami(evt:KeyComboEvent):void { 
       if (evt.keyCombo == KONAMI_CODE){ 
        Alert.show("You know Konami code?","WOW"); 
       } 
      } 
     ]]> 
    </mx:Script> 
</mx:Application> 
+0

une idée de pourquoi cela ne fonctionne peut-être pas sur Flex 4? – Dan

+0

La partie de script devrait fonctionner comme il y a juste AS3. :) –

1
var unlockCode:Array = new Array(38,38,40,40,37,39,37,39,66,65,13); 

var keyPressArray:Array = new Array(); 
stage.addEventListener(KeyboardEvent.KEY_DOWN, checkUnlockCode); 

function checkUnlockCode(e:KeyboardEvent):void { 
    if (keyPressArray.length >= unlockCode.length) { 
     keyPressArray.splice(0,1); 
     keyPressArray.push(e.keyCode.toString()); 
    } else { 
     keyPressArray.push(e.keyCode.toString()); 
    } 
    trace(keyPressArray); 
    if (keyPressArray.toString() == unlockCode.toString()) { 
     trace(unlockCode); 
    } 
}