如何使用Rx.js(javascript的反应式扩展)检测konami代码?

时间:2010-12-02 15:31:34

标签: reactive-extensions-js

我想开始学习Rx.js,我正在寻找一个很好的例子来开始滚球。如何使用Rx.js检测konami code

我想检测一系列按键事件(向上向上,向左下左下方B A)并在出现这种情况时显示图像。

2 个答案:

答案 0 :(得分:7)

这是我的版本:

<html>
<head>
<script type="text/javascript" src="jquery-1.4.4.min.js"></script>
<script type="text/javascript" src="rx.js"></script>
<script type="text/javascript" src="rx.jQuery.js"></script>
</head>
<body>
<p id="result"></p>
<script type="text/javascript">
    $(function() {
        var konami = $(document).toObservable("keyup").Select(function(e) {
            return e.keyCode
        }).SkipWhile(function(k) {
            return (k != 38)
        }).BufferWithCount(
            10
        ).Where(function(ks) {
            return ks.length == 10 &&
                ks[0] == 38 && ks[1] == 38 &&
                ks[2] == 40 && ks[3] == 40 &&
                ks[4] == 37 && ks[5] == 39 &&
                ks[6] == 37 && ks[7] == 39 &&
                ks[8] == 66 && ks[9] == 65
        })

        var konamisub = konami.Subscribe(function(e) {
            $("#result").text("KONAMI!")
            $("#result").fadeIn().fadeOut()
        })
    })
</script>
</body>
</html>

我将keyup事件流转换为带有Select的密钥代码流,然后忽略按键,直到用户按下(键码38)SkipWhile,然后用{收集10次击键{1}},然后使用BufferWithCount检查击键。

我尝试使用BufferWithTime,但它往往会在击键过程中切断。

如果有人可以提出改进建议,我很乐意听到。

答案 1 :(得分:1)

我不想在你学习之后破坏你的答案,但我会把这个问题想象成“我怎样才能将Key up事件变成序列 最近按下“的最后10个字符,并将该列表与”UUDDLRLRBA“的常量列表进行比较。 (提示:缓冲区,Where,Select,Take,Repeat是你的朋友)