Javascript. Отмена неодновременности
Проблема вот в чем: я делаю при помощи canvas онлайн-игру. Используя обычный document.onkeydown, я не могу отследить >1 нажатия.
Мне нужно, чтобы и при нажатии на "W" и при нажатии на "D" протагонист и бежал вверх, и вправо. Т.е. мне не нужно перебирать комбинации типа ("W"+"D")&("W"+"A"), т.к. это будет очень долго, мне просто нужно снять запрет на неодновременное нажатие клавиш.:thanks: |
при нажатии W проверяйте нажаты ли A или D
|
Точнее не так. При нажатии на каждую управляющую клавишу превеяйте нажата ли другая и какая. В зависимости от этих клавишь выбирайте направление движения и запоминайте какая клавиша была нажата. При событии mouseup соответственно убираете эту клавишу из списка "нажатых"
|
Я же писал:
Цитата:
|
У меня в игре очень(!) много разных клавиш движения, так что этот способ не подходит
|
Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?
|
Цитата:
если сможешь сказать какого цвета у меня кнопки на клавиатуре, я постараюсь ответить на твой вопрос :) |
Белые)
|
Ладно, проблему с движением можете не решать... А что делать с одновременным нажатием?
|
Ладно, буду делать через огромные if-блоки...
|
Не надо делать огромные if-блоки. if блоки должны быть маленькие!
|
Есть всего 8 состояний. Каждое состояние запускает свою функцию. Внутри условия только запуск функции. Функция с условиями запускает сама себя каждые n милисек. пока нажата любая из кнопок.
|
Цитата:
как можно не видя кода ответить на это: Цитата:
|
document.onkeydown = function(e) {
if(e.keyCode==37) { tank.vector = "left"; if(tank.x>0) { tank.x-=4; } } |
Вот код движения танка (персонажа).
|
Какой же дожен быть алгоритм?
|
Эээ.. А вы делаете без ООП?
|
Поскольку в коде присутствуют объекты, то это 100% ооп
|
А, да, мой косяк.
|
var keys = { up : false, down : false, left : false, right : false }; function onkeydown(event){ if(event.keyKode === 323){ keys.up = true; } else if(event.keyKode === 32) { keys.down = true; } } function onkeyup(event){ if(event.keyKode === 323){ keys.up = false; } else if(event.keyKode === 32) { keys.down = false; } } в keys всегда хранится актуальное состояние нажатых клавиш. кэп |
Цитата:
Цитата:
Цитата:
как заметил megaupload, всётаки может стоит отрабатывать отпускание клавиши? а то ведь tank.vector = "left"; остаётся А это значит всё. нет ни хранения , вычисления, перерисовок нет визаульного представления, нет в конце концов работы с dom? |
Цитата:
а любая функция, массив ..... это объекты , код с использованием их автоматом ооп? приведённые строки кода, только из за того что у какого то объекта есть свойство, ооп? да ща . почему это не может быть хешем ? не может быть .....? |
var keys = { up : false, down : false, left : false, right : false }; function onkeydown(event){ if(event.keyKode === 323){ keys.up = true; } else if(event.keyKode === 32) { keys.down = true; } } function onkeyup(event){ if(event.keyKode === 323){ keys.up = false; } else if(event.keyKode === 32) { keys.down = false; } } в keys всегда хранится актуальное состояние нажатых клавиш. кэп игру он делает, кодить сначала научись нормально.. |
Время обновить подпись.)
|
Aetae,
а я типа вырос и вылетел из гнезда)? |
Цитата:
отличный детектор! |
Так я и учусь кодить на таких-вот примерах. Я же не пробую делать Max Payne 3: WebGL, а делаю какие-то гнусные танчики... На этом я и учусь.
Извините, а в чем же проблема моего детектора? И да, хэш и объект - одно и то же самое. Цитирую (с javascript.ru): "Объекты (они же - ассоциативные массивы, хэши)..." Так что не надо писать, что я нуб, сами выучите |
var pressed = [], left = 37, up = 38, right = 39, down = 40; addEventListener( 'keydown', function(ev) { pressed[ev.keyCode] = 1; } ); addEventListener( 'keyup', function(ev) { pressed[ev.keyCode] = 0; } ); addEventListener( 'load', function() { if (pressed[left] && pressed[up]) {/*...*/} } ); |
Спасибо
|
Часовой пояс GMT +3, время: 17:45. |