2009-10-09 8 views
35

¿Cuál sería la mejor manera de implementar el código konami en una aplicación flexible?código konami en flex

Quiero crear un componente para agregarlo en todos mis proyectos, solo por diversión.

gracias

Actualización: Me hicieron un componente simple, gracias a 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> 

para probarlo

<?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> 

Respuesta

26

Una máquina de estados es divertido de escribir, pero en este caso me gustaría ir con un patrón de la firma. Dependiendo de donde usted quiere poner el controlador (en el escenario del componente), aquí hay un código que debería funcionar, aunque es probable que pueda apretarlo (y por supuesto personalizarlo según sus necesidades específicas):

// 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

Solo agregue algo de manejo para "B" y "A" y este será el boleto. – fenomas

+0

gracias esto funcionó muy bien, postearé mi componente más tarde para el público interesado – sergiogx

+0

Vaya, está bien. Perdió el BA. :-) OK, entiendes el jist! Lo añadiré. – ZaBlanc

7

Es posible utilizar Casalib. Hay clases, Key y KeyCombo. Puede escuchar por KeyComboEvent.SEQUENCE.

muestra de trabajo:

<?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

¿Alguna idea de por qué esto no funciona en Flex 4? – Dan

+0

La parte del script debería funcionar, ya que simplemente hay 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); 
    } 
}