Вход

Просмотр полной версии : Движение игрока по стрелкам.


Straj
15.08.2014, 23:08
Сделал передвижение игрока по клавишам 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;
}
}


Как быть? Есть кое-какие мысли (добавить еще один слушатель в функции первого), но не уверен в их правильности.

ixth
16.08.2014, 00:41
Почему методы не в повелительном наклонении? Впрочем, неважно.

Где у тебя snakeObj определяется? Что делает clearSnake?

Straj
16.08.2014, 00:45
Да не важно ж. Мне нужен способ движения по нескольким клавишам определить. Даже код не надо, только логику.
Врочем, clearSnake - очищает слой. Довольно успешно.

ixth
16.08.2014, 00:52
Вообще это адский ад. Глобальные переменные, 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();
}
}

Straj
16.08.2014, 01:22
О, большое спасибо. И за книгу