2009-10-09 12 views
35

Jaki byłby najlepszy sposób wdrożenia kodu konami w aplikacji flex?kod konami w flex

Chcę utworzyć komponent, aby dodać go do wszystkich moich proyektów, tylko dla zabawy.

dzięki

UPDATE: Zrobiłem prosty komponent, dzięki 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> 

przetestować go

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

Odpowiedz

26

Maszyna stan jest zabawa pisać, ale w tym przypadku pójdę z wzorem podpisu. W zależności od tego, gdzie chcesz umieścić obsługi (na etapie komponentu), tu jest jakiś kod, który powinien działać, choć prawdopodobnie można dokręcić go (i oczywiście dostosować go do specyficznych potrzeb):

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

Po prostu dodaj trochę obsługi dla "B" i "A", a to będzie bilet. – fenomas

+0

dzięki temu działało świetnie, źle wysłałem mój komponent później dla zainteresowanych publiczności – sergiogx

+0

Ups, youre right. Przegapiłem BA. :-) OK, dostajesz jist! Dodam. – ZaBlanc

7

Można użyć Casalib. Istnieją klasy, Key i KeyCombo. Możesz posłuchać KeyComboEvent.SEQUENCE.

próbka robocza:

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

jakikolwiek pomysł, dlaczego może nie działać w systemie Flex 4? – Dan

+0

Część skryptu powinna działać, ponieważ jest po prostu 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); 
    } 
}