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, время: 07:51. |