Движение игрока по стрелкам.
Сделал передвижение игрока по клавишам WASD. И все бы хорошо, нажал W - движется вверх, S - вниз, но как быть когда нажаты 2 одновременно (должно быть движение по диагонали или стоп).
document.onkeydown = function (e) { keyPressed = e.keyCode; } document.onkeyup = function (e) { keyPressed = null; } //... function loop () { requestAnimationFrame(loop); //... if (keyPressed === 87 || keyPressed===65 || keyPressed===83 || keyPressed===68) { snakeObj.moving(keyPressed); } } Snake.prototype.moving = function (e) { switch (e) { case 87: snakeObj.redrawing(this.snake.getAttr("x"),this.snake.getAttr("y")-SPEED); snakeObj.clearSnake(); break; case 65: snakeObj.redrawing(this.snake.getAttr("x")-SPEED, this.snake.getAttr("y")); snakeObj.clearSnake(); break; case 83: snakeObj.redrawing(this.snake.getAttr("x"),this.snake.getAttr("y")+SPEED); snakeObj.clearSnake(); break; case 68: snakeObj.redrawing(this.snake.getAttr("x")+SPEED,this.snake.getAttr("y")); snakeObj.clearSnake(); break; } } Как быть? Есть кое-какие мысли (добавить еще один слушатель в функции первого), но не уверен в их правильности. |
Почему методы не в повелительном наклонении? Впрочем, неважно.
Где у тебя snakeObj определяется? Что делает clearSnake? |
Да не важно ж. Мне нужен способ движения по нескольким клавишам определить. Даже код не надо, только логику.
Врочем, clearSnake - очищает слой. Довольно успешно. |
Вообще это адский ад. Глобальные переменные, switch практически с копипастой… Попробуй почитать какую-нибудь умную книжку по ООП, например «Совершенный код» или что-нибудь вроде этого.
var KEY_W = 87; var KEY_A = 65; var KEY_S = 83; var KEY_D = 68; var keysPressed = []; document.onkeydown = function (e) { keysPressed.push(e.keyCode); }; document.onkeyup = function (e) { var index = keysPressed.indexOf(e.keyCode); if (index) { keysPressed.splice(index, 1); } }; //... function loop () { requestAnimationFrame(loop); //... snakeObj.moving(keysPressed); } Snake.prototype.moving = function (e) { var dx = 0, dy = 0; if (keysPressed.indexOf(KEY_W) > -1) { dy = -SPEED; } if (keysPressed.indexOf(KEY_A) > -1) { dx = -SPEED; } if (keysPressed.indexOf(KEY_S) > -1) { dy = SPEED; } if (keysPressed.indexOf(KEY_D) > -1) { dx = SPEED; } if (dx !== 0 || dy !== 0) { snakeObj.redrawing( this.snake.getAttr("x") + dx, this.snake.getAttr("y") + dy ); snakeObj.clearSnake(); } } |
О, большое спасибо. И за книгу
|
Часовой пояс GMT +3, время: 03:48. |