2015-11-26 9 views
1

Я создаю игру на холсте для удовольствия, и я пытаюсь перефразировать некоторые из моих команд else else, если вместо этого используются таблицы поиска объектов.Javascript Lookup table vs else if и несколько совпадающих результатов

Это мой текущий код для присвоения значения переменной на KeyDown:

function keyDown(e) { 
    keypressed = true; 

    if (e.keyCode == 39 || e.keyCode == 68) {rightKey = true; } 
    else if (e.keyCode == 37 || e.keyCode == 65) {leftKey = true;} 
    else if (e.keyCode == 38 || e.keyCode == 87) {upKey = true; } 
    else if (e.keyCode == 40 || e.keyCode == 83) {downKey = true; } 
    else if (e.keyCode == 80) { isPaused = !isPaused; document.body.classList.toggle('pause'); } 

    if (e.keyCode === 69) { startHit(); } 
} 

Я хочу назначить обе клавиши WSAD и клавиши со стрелками, чтобы сделать то же самое, при этом использование || в условиях if.

Я читал, что с помощью литерала объекта таблицы поиска является быстрым способом для достижения этой цели, и это моя попытка:

var codes = { 
    39 : function() { 
     return rightKey = true; 
    }, 
    37 : function() { 
     return leftKey = true; 
    }, 
    38 : function() { 
     return upKey = true; 
    }, 
    40 : function() { 
     return downKey = true; 
    }, 
    80 : function() { 
     isPaued = !isPaused; 
     document.body.classList.toggle('pause'); 
    }, 
    69 : startHit 
} 

codes[68] = codes[39]; 
codes[65] = codes[37]; 
codes[87] = codes[38]; 
codes[83] = codes[40]; 

function keyDown(e) { 
    keypressed = true; 
    codes[e.keyCode](); 
} 

Это прекрасно работает, но я не уверен, что назначение нижних клавиш это лучший способ сделать это? Я не могу явно использовать || оператор в назначении левой руки, так будет ли более чистый способ сделать это или я должен просто придерживаться else ifs?

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

Любые советы были бы замечательными. Благодарю.

ответ

1

Почему бы не использовать инструкцию switch?

function keyDown(e) { 
    keypressed = true; 
    switch (e.keyCode) { 
     case 39: 
     case 68: 
      rightKey = true; 
      break; 
     case 37: 
     case 65: 
      leftKey = true; 
      break; 
     case 38: 
     case 87: 
      upKey = true; 
      break; 
     case 40: 
     case 83: 
      downKey = true; 
      break; 
     case 80: 
      isPaused = !isPaused; 
      document.body.classList.toggle('pause'); 
      break; 
     case 69: 
      startHit(); 
    } 
} 
+1

Это похоже на приятное решение. Я не знал, что у меня могут быть оба случая вместе для каждого состояния! (хотя синтаксис оператора switch выглядит странно: D) –

1

что об этом?

var codes = function(){ 
    function rightKey(){ 
    rightKey = true; 
    } 

    function leftKey() { 
    leftKey = true; 
    } 

    return { 
    39 : rightKey, 
    37 : leftKey, 
    '...': '...', 
    68 : rightKey, 
    65 : leftKey 

}}() 
+0

Да, я думал, что это будет способ сделать это. Моя единственная проблема - повторяющаяся часть для повторяющихся значений - 39: rightKey, 68: rightKey. Не делает ли этот код более подробным, чем утверждения if, или он будет по-прежнему более эффективным? Пока мы работаем, мы вызываем функции здесь, чтобы вернуть keyValue; который имеет наибольшие накладные расходы от вызова функций или оценки операторов if? –

+0

Оператор IF должен быть быстрее. Но сначала я думаю, что современные js-двигатели могут оптимизировать такие вызовы функций, и это будет почти одинаковой эффективностью, во-вторых, вы уверены, что вам нужен такой низкий уровень оптимизации? – nahab

+0

Как насчет <повторяющихся значений - 39: rightKey, 68: rightKey> Эффективность в точности такая же, как ваш предложенный вариант – nahab

 Смежные вопросы

  • Нет связанных вопросов^_^