Движение игрока по стрелкам.
Сделал передвижение игрока по клавишам 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, время: 04:00. |