Не удается прочитать свойство 'keyCode' неопределенного при получении чисел ключей для игры в понг - PullRequest
0 голосов
/ 20 мая 2019

Я создаю игру в понг и реализую функцию перемещения весла. Но когда я пытаюсь заставить keyCode увидеть, пытаются ли они переместиться вверх или вниз, я получаю эту ошибку.

Я попытался console.log почти во всем, чтобы помочь выяснить, в чем проблема, и посмотрел, как это сделать в Интернете, и ничего не помогло.

//javascript to get keyCode for wasd paddle
function getWasdKey(e){
 var key = e.keyCode;
  if(key == 87){
    return true;
  }
  if(key == 83){
    return false;
  }
}
//javascript to get keyCode for arrow paddle
function getArrowKey(e){
  var key = e.keyCode;
  if(key == 38){
    return true;
  }
  if(key == 40){
    return false;
  }
}
//where I use the get key functions
function paddleArrowMove(){
  var paddlearrowtop = getStyle('paddlearrow', 'top');
    if(getArrowKey == true){//up
    setStyle('paddlearrow', 'top', paddlearrowtop - 5);
  }
  if(getArrowKey == false){//down
    setStyle('paddlearrow', 'top', paddlearrowtop + 5);
  }
}
function paddleWasdMove(){
  var paddlewasdtop = getStyle('paddlewasd', 'top');
  if(getWasdKey == true){//up
    setStyle('paddlewasdtop', 'top', paddlewasdtop - 5);
  }
  if(getWasdKey == false){//down
    setStyle('paddlewasdtop', 'top', paddlewasdtop + 5);
  }
}

//html to run the javascript
<body onload="startIntervals();" onkeypress="getArrowKey(); getWasdKey();">

Я ожидал, что весла будут перемещаться вверх и вниз, но вместо этого получил ошибку «not read свойство 'keyCode' undefined».

1 Ответ

3 голосов
/ 20 мая 2019

Ваши функции getArrowKey и getWasdKey принимают параметр e, который вы явно намереваетесь быть объектом события для соответствующего события. И все же вы вызываете их без параметров:

onkeypress="getArrowKey(); getWasdKey();"

Когда вы вызываете функцию в Javascript и не можете передать все ее формальные параметры, предполагается, что вы не предоставите undefined. Вот что здесь происходит с e и вызывает вашу ошибку.

Поскольку использование атрибутов on*, как правило, является плохой идеей, я бы порекомендовал решить эту проблему, добавив прослушиватели событий с использованием Javascript. Помимо других преимуществ, таких как разделение интересов между содержимым и логикой, функция, которую вы передаете addEventListener, автоматически вызывается с объектом события в качестве его параметра при вызове.

Удалите это:

onkeypress="getArrowKey(); getWasdKey();"

из элемента body и добавьте его в свой Javascript вместо этого:

document.body.addEventListener("keypress", function(e) {
    getArrowKey(e);
    getWasdKey(e);
});

Кроме того, как правильно заметил @connexo, ваша startIntervals функция совершенно не нужна и, вероятно, вызовет ошибки - так что я бы просто удалил это.

...