Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Javascript. Отмена неодновременности (https://javascript.ru/forum/misc/37152-javascript-otmena-neodnovremennosti.html)

Valdemor 09.04.2013 16:52

Javascript. Отмена неодновременности
 
Проблема вот в чем: я делаю при помощи canvas онлайн-игру. Используя обычный document.onkeydown, я не могу отследить >1 нажатия.
Мне нужно, чтобы и при нажатии на "W" и при нажатии на "D" протагонист и бежал вверх, и вправо.
Т.е. мне не нужно перебирать комбинации типа ("W"+"D")&("W"+"A"), т.к. это будет очень долго, мне просто нужно снять запрет на неодновременное нажатие клавиш.:thanks:

tsigel 09.04.2013 17:01

при нажатии W проверяйте нажаты ли A или D

tsigel 09.04.2013 17:04

Точнее не так. При нажатии на каждую управляющую клавишу превеяйте нажата ли другая и какая. В зависимости от этих клавишь выбирайте направление движения и запоминайте какая клавиша была нажата. При событии mouseup соответственно убираете эту клавишу из списка "нажатых"

Valdemor 09.04.2013 17:04

Я же писал:
Цитата:

Сообщение от Valdemor (Сообщение 245078)
Т.е. мне не нужно перебирать комбинации типа ("W"+"D")&("W"+"A"), т.к. это будет очень долго


Valdemor 09.04.2013 17:06

У меня в игре очень(!) много разных клавиш движения, так что этот способ не подходит

Valdemor 09.04.2013 17:07

Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?

dmitriymar 09.04.2013 17:13

Цитата:

Сообщение от Valdemor
Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?

да уж , телепаты здесь только и есть.
если сможешь сказать какого цвета у меня кнопки на клавиатуре, я постараюсь ответить на твой вопрос :)

Valdemor 09.04.2013 17:21

Белые)

Valdemor 09.04.2013 17:26

Ладно, проблему с движением можете не решать... А что делать с одновременным нажатием?

Valdemor 09.04.2013 17:26

Ладно, буду делать через огромные if-блоки...

tsigel 09.04.2013 17:27

Не надо делать огромные if-блоки. if блоки должны быть маленькие!

tsigel 09.04.2013 17:29

Есть всего 8 состояний. Каждое состояние запускает свою функцию. Внутри условия только запуск функции. Функция с условиями запускает сама себя каждые n милисек. пока нажата любая из кнопок.

dmitriymar 09.04.2013 17:49

Цитата:

Сообщение от Valdemor
Белые)

нет конечно.
как можно не видя кода ответить на это:
Цитата:

Сообщение от Valdemor
Кстати, если персонаж движется влево, и я сразу же нажимаю вверх, то персонаж стоит еще ~полсекунды. Почему?

Хотя можно -алгоритм неверный в корне

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

Какой же дожен быть алгоритм?

tsigel 09.04.2013 17:56

Эээ.. А вы делаете без ООП?

Valdemor 09.04.2013 18:26

Поскольку в коде присутствуют объекты, то это 100% ооп

tsigel 09.04.2013 18:29

А, да, мой косяк.

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

Цитата:

Сообщение от Valdemor
document.onkeydown = function(e) {
if(e.keyCode==37) {
tank.vector = "left";
if(tank.x>0) {
tank.x-=4;
}
}

Цитата:

Сообщение от Valdemor
Вот код движения танка (персонажа).

Цитата:

Сообщение от Valdemor
Какой же дожен быть алгоритм?

:-E
как заметил megaupload, всётаки может стоит отрабатывать отпускание клавиши? а то ведь tank.vector = "left"; остаётся

А это значит всё. нет ни хранения , вычисления, перерисовок нет визаульного представления, нет в конце концов работы с dom?

dmitriymar 09.04.2013 20:26

Цитата:

Сообщение от Valdemor
Поскольку в коде присутствуют объекты, то это 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 всегда хранится актуальное состояние нажатых клавиш. кэп

игру он делает, кодить сначала научись нормально..

Aetae 09.04.2013 21:38

Время обновить подпись.)

megaupload 13.04.2013 05:05

Aetae,
а я типа вырос и вылетел из гнезда)?

melky 13.04.2013 06:26

Цитата:

Сообщение от Valdemor (Сообщение 245125)
Поскольку в коде присутствуют объекты, то это 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

Спасибо


Часовой пояс GMT +3, время: 13:17.