Flex中的Konami代码

34

如何最好地在Flex应用程序中实现Konami代码?

我想创建一个组件,将其添加到所有项目中,只是为了好玩。

谢谢

更新:我根据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

写状态机是有趣的,但在这种情况下,我会选择签名模式。根据你想把处理程序放在哪个组件阶段,以下代码应该可以工作,尽管你可能可以缩紧它(当然也可以根据你特定的需求进行自定义):

// 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
只需添加一些“B”和“A”的处理,这就是解决方案。 - fenomas
谢谢,这个很好用,我稍后会为感兴趣的公众发布我的组件。 - sergiogx
哎呀,你说得对。我漏掉了BA。 :-) 好的,你明白我的意思!我会添加的。 - ZaBlanc
我不认为有Keyboard.B和Keyboard.A :P 请看我的回答 :) - Andy Li
1
根据您的灵活性需求,您可能需要测试最后输入的10个字符而不是前10个字符。因此,如果用户键入UUUDDLRLRBA或在中间输错,他们可以重新开始并仍然有效。类似这样:signatureKeySequence = signatureKeySequence.substr(signatureKeySequence - KONAMI_CODE.length); - Newtang

7

您可以使用Casalib。它提供了KeyKeyCombo类。您可以监听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>

脚本部分应该可以正常工作,因为只有纯AS3。 :) - Andy Li

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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接