35 votes

code konami en flex

Quel serait le meilleur moyen d'implémenter le code Konami dans une application flex?

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

Merci

UPDATE: J'ai fabriqué 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>
 

26voto

ZaBlanc Points 2396

Une machine à états est amusante à écrire, mais dans ce cas, je choisirais un motif de signature. En fonction de l'endroit où vous souhaitez placer le gestionnaire (sur la scène du composant), voici du code qui devrait fonctionner, bien que vous puissiez probablement le resserrer (et bien sûr le personnaliser en fonction de vos besoins spécifiques):

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

7voto

Andy Li Points 2909

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>
 

1voto

Brett Points 11
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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X