2013-06-04 3 views
1

Я создаю сетевую скачную игру для двух игроков, где одна лошадь управляется с помощью клавиш со стрелками, а другая управляется с помощью клавиш asdw. Я использую html и javascript. Моя проблема заключается в том, что программа только иногда обнаруживает события, связанные с клавиатурой, (примерно в 65% случаев), поэтому игра не очень чувствительна к нажатиям клавиш. Мой код выглядит следующим образом:Моя веб-игра javascript не очень чувствительна к событиям onkeyup. Как я могу заставить программу обнаруживать все нажатия клавиш, а не только некоторые из них?

Мой отношение HTML код:

<body onkeyup="steer(event)" onload = "init()"> 

Мой отношение Javascript является:

function init(){ 
    ...code that counts 3,2,1,go!... 
    setTimeout(function(){doMove();}, 3000); 
} 

function steer(event){ 
    key = (event.keyCode); 
    if(key == 38) up(); 
    if(key == 40) dn(); 
    if(key == 37) lt(); 
    if(key == 39) rt(); 
    if(key == 87) up2(); 
    if(key == 83) dn2(); 
    if(key == 65) lt2(); 
    if(key == 68) rt2(); 
    } 
} 
function doMove(){ 

    ...code for moving the horses... 
    setTimeout(doMove, 5); 


} 

вверх(), дп() и т.д .. функции просто код для изменения скоростей лошадей на основе событий keyup.

Программа распознает только 65% нажатий клавиш (прибл.), Даже если играет только один игрок (это не имеет никакого отношения к одновременным нажатиям клавиш).

+0

Подобно тому, как предложение: 'ключ = (event.keyCode || event.which) ; '. Но это не ответ, просто примечание :) – RaphaelDDL

+0

В настоящее время 'key' является глобальной переменной, а не локальной для функции управления. Сначала попробуйте использовать 'var key' вместо' key'. Наверное, не ответ, но он вырезает несколько потенциальных ошибок. – iblamefish

+0

Откуда вы знаете, что он не обнаруживает нажатия клавиш? Записывали ли вы каждый вызов на 'steer'? Ваша клавиатура в порядке? Btw, обычно вы используете onkeydown вместо -up. – Bergi

ответ

0

Использование этого jsFiddle key tracking code Я не могу пропустить захват ключа. Возможно, что другой элемент захватывает и предотвращает появление пузыря на событии, или, возможно, браузер перегружен движением (я меняю настройка на заданный интервал, который должен быть проще на клиентах).

Также я изменил его использовать переключатель, и ключевые коды, которые не требуют использования смены ключа

var steer = function (event) { 
    var key = (event.keyCode || event.which); 

    switch (key) { 
     case 73: 
      up(); 
      break; 
     case 75: 
      dn(); 
      break; 
     case 74: 
      lt(); 
      break; 
     case 76: 
      rt(); 
      break; 
     case 87: 
      up2(); 
      break; 
     case 83: 
      dn2(); 
      break; 
     case 65: 
      lt2(); 
      break; 
     case 68: 
      rt2(); 
      break; 
     } 
    }; 
+0

Все еще не сработало. Я изменил ключ на локальную переменную и добавил event.which. Я также попытался увеличить setTimeout, чтобы отложить 15 мс вместо 5, но все равно не работал. Я знаю, что это иногда не было для функции steer(), потому что я добавил предупреждение («привет»), и он только сказал «привет» примерно в 65% случаев, когда я нажал клавишу. Моя клавиатура отлично работает, я знаю, потому что я могу печатать без проблем. Я использую keyup вместо keydown, потому что два человека должны играть одновременно, и я хочу заставить их отпустить свой ключ, чтобы переместить свою лошадь. – Asher

+0

Omigod! Я только что понял свою ошибку! Извините, это было в коде, который я использовал. Только логическая ошибка с моей стороны. Извините за беспокойство. Спасибо Джеффу Майеру за помощь. Именно во время моего изучения кода, введенного в JSFiddle, я нашел свою ошибку. Еще раз спасибо! – Asher