Показать сообщение отдельно
  #1 (permalink)  
Старый 27.09.2018, 13:40
Аспирант
Отправить личное сообщение для drakulawz Посмотреть профиль Найти все сообщения от drakulawz
 
Регистрация: 13.08.2018
Сообщений: 79

Как сделать одноразовое нажатие клавиш.
Здравствуйте!
(Это работа с канвасом.)
Есть скрипт для одновременного нажатия клавиш, всё работает, но мне нужно сделать чтобы при нажатии, например, стрелки в верх и влево, эти клавиши срабатывали лишь раз (аналогично и с одной клавишей), т.е. нужно прервать выполнение функции после того как условие выполнится, но такое ощущения, что то условие которое я написал вообще не проверяется - это я думаю, что так надо сделать - надеюсь меня наставят на путь истинный и помогут решить эту головоломку. Другими словами, мне нужно, чтобы "player" перемещался на "speed" или по оси "х", или по "у", или по оси "х - у" одновременно (по диагонали) - нажал клавишу и держи сколько хочешь, но "player" сдвинется только на "speed", нажмёшь ещё раз - сдвинется ещё раз.
Вот скрипты:

Для обработки клавишь:
var keys = {
    'W': 87,
    'S': 83,
    'A': 65,
    'D': 68,
    'LEFT': 37,
    'RIGHT': 39,
    'UP': 38,
    'DOWN': 40,
    'PAUSE': 32
};

var keyDown = {};

var setKey = function (keyCode) {
    keyDown[keyCode] = true;
    //    console.log(keyCode);
};

var clearKey = function (keyCode) {
    keyDown[keyCode] = false;
};

var isKeyDown = function (keyName) {
    return keyDown[keys[keyName]] == true;
};

var isAnyKeyDown = function () {
    for (var k in keyDown) {
        if (keyDown[k])
            return true;
    }
};

window.onkeydown = function (e) {
    setKey(e.keyCode);
};
window.onkeyup = function (e) {
    clearKey(e.keyCode);
};


То, что должно двигаться по нажатию:
var player = {
    level: 1,
    hp: 3,
    width: 50,
    height: 50,
    x: 320,
    y: 240,
    speed: 2,
    dx: 0,
    dy: 0,
    score: 0,
    color: randomColor(),

    draw: function () {
        drawRect(this.x, this.y, this.width, this.height, this.color);
    },

       // попытка сделать то что задумал:
        move: function () {
        if (this.x != this.x + this.width || 
            this.y != this.y + this.height || 
            this.x != this.x - this.width || 
            this.y != this.y - this.height) {
            if (isKeyDown('LEFT')) {
                this.x -= this.speed;
                this.dx = -1;
            } else if (isKeyDown('RIGHT')) {
                this.x += this.speed;
                this.dx = 1;
            } else {
                this.dx = 0
            }
            if (isKeyDown('DOWN')) {
                this.y += this.speed;
                this.dy = 1;
            } else if (isKeyDown('UP')) {
                this.y -= this.speed;
                this.dy = -1;
            } else {
                this.dy = 0;
            }
        } else {
            return;
        }
    },

    init: function (x, y) {
        this.x = x;
        this.y = y;
    }
};
Ответить с цитированием