Просмотр полной версии : Javascript. Отмена неодновременности
Valdemor
09.04.2013, 16:52
Проблема вот в чем: я делаю при помощи canvas онлайн-игру. Используя обычный document.onkeydown, я не могу отследить >1 нажатия.
Мне нужно, чтобы и при нажатии на "W" и при нажатии на "D" протагонист и бежал вверх, и вправо.
Т.е. мне не нужно перебирать комбинации типа ("W"+"D")&("W"+"A"), т.к. это будет очень долго, мне просто нужно снять запрет на неодновременное нажатие клавиш.:thanks:
при нажатии W проверяйте нажаты ли A или D
Точнее не так. При нажатии на каждую управляющую клавишу превеяйте нажата ли другая и какая. В зависимости от этих клавишь выбирайте направление движения и запоминайте какая клавиша была нажата. При событии mouseup соответственно убираете эту клавишу из списка "нажатых"
Valdemor
09.04.2013, 17:04
Я же писал:
Т.е. мне не нужно перебирать комбинации типа ("W"+"D")&("W"+"A"), т.к. это будет очень долго
Valdemor
09.04.2013, 17:06
У меня в игре очень(!) много разных клавиш движения, так что этот способ не подходит
Valdemor
09.04.2013, 17:07
Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?
dmitriymar
09.04.2013, 17:13
Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?
да уж , телепаты здесь только и есть.
если сможешь сказать какого цвета у меня кнопки на клавиатуре, я постараюсь ответить на твой вопрос :)
Valdemor
09.04.2013, 17:21
Белые)
Valdemor
09.04.2013, 17:26
Ладно, проблему с движением можете не решать... А что делать с одновременным нажатием?
Valdemor
09.04.2013, 17:26
Ладно, буду делать через огромные if-блоки...
Не надо делать огромные if-блоки. if блоки должны быть маленькие!
Есть всего 8 состояний. Каждое состояние запускает свою функцию. Внутри условия только запуск функции. Функция с условиями запускает сама себя каждые n милисек. пока нажата любая из кнопок.
dmitriymar
09.04.2013, 17:49
Белые)
нет конечно.
как можно не видя кода ответить на это:Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?
Хотя можно -алгоритм неверный в корне
Valdemor
09.04.2013, 17:54
document.onkeydown = function(e) {
if(e.keyCode==37) {
tank.vector = "left";
if(tank.x>0) {
tank.x-=4;
}
}
Valdemor
09.04.2013, 17:54
Вот код движения танка (персонажа).
Valdemor
09.04.2013, 17:54
Какой же дожен быть алгоритм?
Эээ.. А вы делаете без ООП?
Valdemor
09.04.2013, 18:26
Поскольку в коде присутствуют объекты, то это 100% ооп
megaupload
09.04.2013, 20:06
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 всегда хранится актуальное состояние нажатых клавиш. кэп
dmitriymar
09.04.2013, 20:22
document.onkeydown = function(e) {
if(e.keyCode==37) {
tank.vector = "left";
if(tank.x>0) {
tank.x-=4;
}
}
Вот код движения танка (персонажа).
Какой же дожен быть алгоритм?
:-E
как заметил megaupload, всётаки может стоит отрабатывать отпускание клавиши? а то ведь tank.vector = "left"; остаётся
А это значит всё. нет ни хранения , вычисления, перерисовок нет визаульного представления, нет в конце концов работы с dom?
dmitriymar
09.04.2013, 20:26
Поскольку в коде присутствуют объекты, то это 100% ооп
а все переменные хранятся в глобальном объекте -это делает любой код автоматически ооп?
а любая функция, массив ..... это объекты , код с использованием их автоматом ооп?
приведённые строки кода, только из за того что у какого то объекта есть свойство, ооп? да ща . почему это не может быть хешем ? не может быть .....?
megaupload
09.04.2013, 21:12
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
13.04.2013, 05:05
Aetae,
а я типа вырос и вылетел из гнезда)?
Поскольку в коде присутствуют объекты, то это 100% ооп
хахаха.
отличный детектор!
Valdemor
04.05.2013, 01:50
Так я и учусь кодить на таких-вот примерах. Я же не пробую делать Max Payne 3: WebGL, а делаю какие-то гнусные танчики... На этом я и учусь.
Извините, а в чем же проблема моего детектора?
И да, хэш и объект - одно и то же самое. Цитирую (с javascript.ru):
"Объекты (они же - ассоциативные массивы, хэши)..."
Так что не надо писать, что я нуб, сами выучите ассемблер матчасть
qwerty-клавиатура
04.05.2013, 17:21
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]) {/*...*/} } );
Valdemor
04.05.2013, 17:44
Спасибо
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot