код конами в flex - PullRequest
       20

код конами в flex

35 голосов
/ 10 октября 2009

Как лучше всего реализовать код конами в гибком приложении?

Я хочу создать компонент для добавления его на все мои проекты, просто для удовольствия.

спасибо

ОБНОВЛЕНИЕ: я сделал простой компонент, благодаря 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>

чтобы проверить это

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

Ответы [ 3 ]

26 голосов
/ 10 октября 2009

Конечный автомат писать весело, но в этом случае я бы использовал шаблон подписи. В зависимости от того, куда вы хотите поместить обработчик (на стадии компонента), вот некоторый код, который должен работать, хотя вы, вероятно, можете его сжать (и, конечно, настроить его под свои конкретные потребности):

// 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!
    }
}
7 голосов
/ 10 октября 2009

Вы можете использовать Casalib . Есть классы Key и KeyCombo. Вы можете слушать KeyComboEvent.SEQUENCE.

Рабочий образец:

<?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>
1 голос
/ 18 ноября 2011
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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...