views:

602

answers:

2
+19  Q: 

konami code in flex

What would be the best way to implement the konami code into a flex application?

I want to create a component to add it on all my proyects, just for fun.

thanks

UPDATE: I made a simple component, thanks to 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>

to test it

<?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>
+4  A: 

You may use Casalib. There are classes, Key and KeyCombo. You may listen for KeyComboEvent.SEQUENCE.

Working sample:

<?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>
Andy Li
any idea why this may not be working on Flex 4?
Dan
The script part should just work as there is just plain AS3. :)
Andy Li
+12  A: 

A state machine is fun to write, but in this case I'd go with a signature pattern. Depending on where you want to put the handler (on the stage of the component), here's some code that should work, though you can probably tighten it (and of course customize it to your specific need):

// 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!
    }
}
ZaBlanc
Just add in some handling for "B" and "A" and this'll be the ticket.
fenomas
thanks this worked great, ill post my component later for the interested public
sergiogx
Oops, yer right. Missed the BA. :-) OK, you get the jist! I'll add.
ZaBlanc
I don't think there are Keyboard.B and Keyboard.A :P See my answer for that :)
Andy Li
Depending on how flexible you want it, you might have to test the last 10 characters entered instead of the first 10. So if a user types UUUDDLRLRBA or mistypes in the middle, they can start over and it'll still be valid. Something like this:signatureKeySequence = signatureKeySequence.substr(signatureKeySequence - KONAMI_CODE.length);
Newtang