Как переместить один объект на холсте (PACMAN) при нажатии клавиши

У меня проблема с моей программой Javascript. Я делаю пакмана. Мне нужно переместить изображение (pacman) на холсте, когда пользователь нажимает клавишу, поэтому я сделал функцию, которая будет запускаться, когда происходит событие. Я думаю, что проблема возникает из-за того, что событие не принято. Мне нужна ваша помощь. Спасибо!!

function startGame()
{
    var canvas = document.getElementById("canvas");
    var context = canvas.getContext("2d");
    pacman_derecha.src = 'pacman_derecha.jpg';
    pacman_derecha.onload = function()
    {
        context.drawImage(pacman_derecha, pos_pacman_x,pos_pacman_y);
    }

    /* Procedimiento principal */

    /* Dibujamos el escenario */
    for (var i = 0; i < escenario.length; i++)
    {
        var x = escenario[i].x;
        var y = escenario[i].y;
        var ancho = escenario[i].ancho;
        var alto = escenario[i].alto;
        context.strokeStyle = "#0000ff";
        context.lineWidth = 2;
        context.strokeRect(x, y, ancho, alto);
    }

    /* Dibujamos las bolitas */
    context.strokeStyle = "#f3f3f3";
    for(var j = 0; j < bolas.length; j++)
    {
        var x = bolas[j].x;
        var y = bolas[j].y;
        context.strokeRect(x,y,2,2);
    }

    /* Pintamos de nuevo el escenario y la nueva posicion del pacman */
    setInterval(drawloop, 10);

    /* Analizamos si el usuario presiona alguna tecla */
    canvas.addEventListener('keydown', movimiento, true);

}

function movimiento(evento)
{
    alert(evento.keyCode);
    switch (evento.keyCode)
    {
        /*derecha*/
        case 39:
            pos_pacman_x = pos_pacman_x + 200;
            break;

        /*izquierda*/
        case 37:
            pos_pacman_x = pos_pacman_x - 200;
            break;

        /*abajo*/
        case 40:
            pos_pacman_y = pos_pacman_y - 200;
            break;

        /*arriba*/
        case 38:
            pos_pacman_y = pos_pacman_y + 200;
            break;

        default:
            pos_pacman_x = pos_pacman_x + 50;
            pos_pacman_y = pos_pacman_y - 50;
            break;
    }
}

function drawloop()
{
    pacman_arriba.src = 'pacman_arriba.jpg';
    pacman_arriba.onload = function()
    {
        context.drawImage(pacman_arriba, pos_pacman_x,pos_pacman_y);
    }
    alert(pos_pacman_x+" - "+pos_pacman_y)
}

person l.soriai    schedule 22.03.2016    source источник
comment
Когда вы меняете свои значения, вы изменяете местоположение изображения?   -  person Martin Verjans    schedule 22.03.2016
comment
пожалуйста, вставьте свой код здесь вместо того, чтобы использовать снимок экрана   -  person Noam Hacker    schedule 22.03.2016
comment
Возможный дубликат stackoverflow.com/questions/15647810/   -  person sigalor    schedule 22.03.2016


Ответы (1)


Невозможно заставить canvas прослушивать keydown-события, потому что вы не можете сфокусировать его с помощью курсора. Вместо этого вы должны заставить окно прослушивать эти события:

window.onkeydown = movimiento;
person sigalor    schedule 22.03.2016
comment
Я опубликовал код. Я читал об этом, но думаю, что проблема не в этом, потому что canvas — это имя одной переменной, и эта переменная имеет элемент canvas. - person l.soriai; 22.03.2016
comment
Я знаю, что canvas - это просто переменная и указывает на фактический холст в вашем HTML-коде (как говорит ваш код, используя document.getElementById(...). Но это ничего не меняет в том, что холст не фокусируется, поэтому вы не можете добавить работающий прослушиватель событий keydown к этому. - person sigalor; 22.03.2016
comment
Хорошо, я только что изменил код, но он не работает. Могу ли я вывести тот же код моей последней функции 'movimiento', или мне придется изменить какое-либо предложение? - person l.soriai; 22.03.2016
comment
Я думаю, вам не нужно ничего менять в movimiento, потому что содержимое события должно оставаться неизменным, независимо от того, window или кто-то другой пересылает событие movimiento. - person sigalor; 22.03.2016
comment
Это не работает... Спасибо за помощь. :* - person l.soriai; 22.03.2016
comment
Что именно не работает? Вся функция проверки нажатия клавиш? Если это просто синтаксическая ошибка, взгляните на встроенную веб-консоль. В Firefox вы можете найти его в разделе «Дополнительно» -> «Веб-разработчик» -> «Веб-консоль». Он должен регистрировать все синтаксические ошибки в вашем коде JavaScript. - person sigalor; 22.03.2016
comment
Ох! Спасибо, я этого не знаю. Я использовал этот трюк, и консоль показала мне это сообщение: «Невозможно прочитать свойство« keyCode »неопределенного» - person l.soriai; 22.03.2016
comment
@Wilt Я знаю, что такое консоль, но не знаю, где она. Тем не менее, эта страница предназначена для вопросов и ответов, или нет? Так что, думаю, ваш комментарий излишен. - person l.soriai; 22.03.2016
comment
На самом деле вы можете заставить холст html5 прослушивать ключевые события. Вам просто нужно установить его табуляцию, а затем слушать ключевые события. Точно так же, как текст ввода-типа, пользователь должен щелкнуть внутри холста, чтобы получить его фокус. Поэтому, вероятно, проще прослушивать ключевые события в документе, а затем реагировать, только если выдающий элемент является вашим холстом. - person markE; 22.03.2016