Игра: одновременный ввод с клавиатуры (беги и прыгай)

Я пытаюсь создать платформер на базе jquery, но в лучшем случае я новичок. Первая проблема, с которой я столкнулся, — это одновременный ввод с клавиатуры (так сказать, беги и прыгай). Просто интересно, что я делаю неправильно;

var tickRate = 100,
    slideB = 0,
    slideC = 0,
    oldV = 0,
    time = 0;

$('body').keydown(function(e){
    e.stopPropagation();
    if (e.keyCode == '38') { jump(); }
    if (e.keyCode == '40') { }
    if (e.keyCode == '37') { slideB += 1; run(); }
    if (e.keyCode == '39') { slideB -= 1; run(); }
    $("#Background").css('left', (slideB * 10) + 'px');
    $("#Tell").html(slideB);
});

var run = function() {
    slideC -= 1;
    if (slideC < -20) {slideC = 0;}
    $("#Sprite").html(slideC * -11);
};

var jump = function(){
    $("#Character").animate({ top: "50px" },{ duration: 1000, easing: "easeOutQuad" });
    $("#Character").animate({ top: "200px" },{ duration: 1000, easing: "easeInQuad" });
}

В настоящее время, если я нажал Бежать вниз (стрелка вправо), то я прыгаю (стрелка вверх), я перестаю бежать, пока снова не нажму Бежать.

В какой-то момент мне понадобится счетчик вверх, поэтому, возможно, я мог бы связать сценарий «проверить, нажата ли клавиша».

Любые предложения полезны. Спасибо.


person C_K    schedule 25.01.2013    source источник


Ответы (2)


Для общей идеи вы можете попробовать что-то вроде этого: {вы должны установить продолжительность интервала в зависимости от продолжительности каждой анимации и/или, возможно, использовать метод .stop() для каждой анимации и/или использовать флаг.

http://jsfiddle.net/7juFk/

(function () {
    $('body').on('keydown keyup', function (e) {
        e.stopPropagation();
        var key = e.which,
            type = e.type;
        switch (key) {
            case 38:
                [type == 'keydown' ? jump() : clearInterval(intervalJump)];
                break;
            case 37:
                [type == 'keydown' ? run() : clearInterval(intervalRun)];
                break;
        }
    });
    var intervalRun,
    intervalJump,
    run = function () {
        console.log('running');
        clearInterval(intervalRun);
        intervalRun = setInterval(run, 0);
    },
    jump = function () {
        console.log('jumping');
        clearInterval(intervalJump);
        intervalJump = setInterval(jump, 0);
    }
})();
person A. Wolff    schedule 25.01.2013

Я понял, что я делаю неправильно. Мои функции рисования должны были быть вместе с setInterval, чтобы перерисовать все это.

person C_K    schedule 25.01.2013