2012-01-14 4 views
-2

Я разрабатываю редукцию понга в html5 и javascript. Мне нужна помощь в его модификации, чтобы при удержании D она вычитала 4 из переменной ball.speedModifier, а затем добавила 4 после отпускания D. Причина, по которой я не просто устанавливаю модификатор обратно на 0 при отпускании ключа, потому что я хочу иметь несколько вещей, изменяющих модификатор сразу, что стек друг над другом. С моей текущей системой для обнаружения нажатия клавиш сложение и вычитание переменной повторялось бы при 60 FPS, в то время как я только хочу, чтобы это произошло один раз, пока сумма не будет вычтена снова.Нужна помощь при временном изменении переменной

Вот Pastie моего кода: HTML: http://pastebin.com/txeNftNT
Javascript: http://pastebin.com/scpBqGqx

+1

SO Q & As должно быть самодостаточным. Это нормально, чтобы ссылаться на внешние контейнеры для вставки (особенно, если они могут запускать код в интерактивном режиме), но [минимальный образец] (http://sscce.org/) (полный, краткий и репрезентативный) должен быть включен в вопрос, в когда связанная страница снимается или редактируется. – outis

ответ

0

Я думаю, что самый простой способ сделать это - отслеживать дополнительные свойства для каждой клавиши. Вместо того, чтобы проверять, не нажата ли клавиша или вверх, вы также хотите отслеживать, была ли клавиша нажата или вверх на предыдущей итерации checkInput(). Таким образом, если клавиша «D» опущена, но она не была последней итерацией, вы вычитаете 4 из ball.speedModifier. Альтернативно, если клавиша «D» поднята, но не была на последней итерации, вы затем добавляете 4 обратно в ball.speedModifier.

Заключительный ключ к выполнению этой работы находится в конце каждого цикла checkInput, вы сохраняете, был ли каждый ключ опущен или нет. Затем в следующем цикле checkInput() вы снова готовы выполнить свои проверки.

Следующее является просто псевдокодом, но, надеюсь, дает идею.

function checkInput(){ 
if(d.isDown()){ 
    if(!d.wasDown()){ 
      ball.speedModifer -= 4; 
    } 
}else{ 
    if(d.wasDown()){ 
      ball.speedModifier += 4; 
    } 
} 

d.wasDown = d.isDown; 
} 

На всякий случай, я также собрал рабочий пример. Обратите внимание на три изменения. Ваш нажатыйKeys больше не является массивом, а является объектом KeyCodes, который соответствует VALUES вашего существующего объекта KEY. И тогда значение этого ключа - это сам объект с двумя ключами «wasDown» и «isDown». Затем я предварительно заполняю этот объект в конце init(), а затем выполняю различные проверки и обновления в checkInput, используя новый объект вместо массива.

http://jsfiddle.net/gUgGf/

Надеется, что помогает!

+1

Вау, это именно то, что мне нужно! Большое вам спасибо за вашу помощь! –

0

Я могу думать о двух довольно простых способов сделать то, что вы хотите:

  1. Есть переменная, которая хранит базовое значение, а затем каждый кадр выполняет все ваши вычисления для любых применимых модификаторов вместо прямого редактирования значения.
  2. Есть массив с именем что-то вроде pressedThisFrame, что вы нажимаете клавиши, чтобы из вашего keydown события, и в главном цикле вы перемещаете записи из pressedThisFrame и вашего общего pressedKeys массива, и часть этого движения включает выполнение любой модификаторы подходящее.
+0

Не похоже, что это применимо к тому, что именно я пытаюсь сделать. Может быть, вы могли бы привести пример кода? Проще говоря, я хочу, чтобы нажатие D замедляло шарик, и, освобождая D, возвращал его на нормальную скорость, однако я не хочу, чтобы он напрямую устанавливал переменную для скорости шара. Вместо этого я хочу, чтобы он добавлял к переменной, которая меняет скорость шара. –

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