Подтвердить что ты не робот

Плавное движение персонажа в игре с холстом с помощью клавиш управления

Правильно, я создаю бесконечную бесконечную тематическую игру, использующую canvas и javascript. Я управляю космическим кораблем только с помощью стрелок вверх и вниз, и я хочу реализовать какое-то движение, чтобы корабль не просто остановился, когда я отпустил ключи. Я огляделся и ничего не нашел, кроме моих собственных попыток, просто не работает, вот что я пробовал...

Jet.prototype.checkDirection = function () {
if (this.isUpKey) {
    this.drawY -= this.speed;
    if (this.speed < 5) {
        this.speed += 0.1;
    }
}
if (this.isDownKey) {
    this.drawY += this.speed;
    if (this.speed < 5) {
        this.speed += 0.1;
    }
}
if (!this.isUpKey) {
    if (!this.isDownKey) {
        if (this.speed >= 0) {
            this.drawY -= this.speed;
            this.speed -= 1;
        }
    }
}
if (!this.isDownKey) {
    if (!this.isUpKey) {
        if (this.speed >= 0) {
            this.drawY += this.speed;
            this.speed -= 1;
        }
    }
}
4b9b3361

Ответ 1

Вы просто хотите применить некоторые трения. Это довольно легко. Вы можете сделать что-то вроде следующего.

this.speed*=0.98;

Чем ниже значение (0,8, 0,5 и т.д.), тем быстрее вы будете замедляться.

Я представил демоверсию, где вы можете передвигаться и постепенно замедляться. Идите вперед и играйте со значением и посмотрите, как он влияет на него.

Live Demo

var canvas = document.getElementById("canvas"),
    ctx = canvas.getContext("2d");

canvas.width = canvas.height = 300;

var x = 150,  //initial x
    y = 150,  // initial y
    velY = 0,
    velX = 0,
    speed = 2, // max speed
    friction = 0.98, // friction
    keys = [];

function update() {
    requestAnimationFrame(update);

    // check the keys and do the movement.
    if (keys[38]) {
        if (velY > -speed) {
            velY--;
        }
    }

    if (keys[40]) {
        if (velY < speed) {
            velY++;
        }
    }
    if (keys[39]) {
        if (velX < speed) {
            velX++;
        }
    }
    if (keys[37]) {
        if (velX > -speed) {
            velX--;
        }
    }

    // apply some friction to y velocity.
    velY *= friction;
    y += velY;

    // apply some friction to x velocity.
    velX *= friction;
    x += velX;

    // bounds checking
    if (x >= 295) {
        x = 295;
    } else if (x <= 5) {
        x = 5;
    }

    if (y > 295) {
        y = 295;
    } else if (y <= 5) {
        y = 5;
    }

    // do the drawing
    ctx.clearRect(0, 0, 300, 300);
    ctx.beginPath();
    ctx.arc(x, y, 5, 0, Math.PI * 2);
    ctx.fill();
}

update();

// key events
document.body.addEventListener("keydown", function (e) {
    keys[e.keyCode] = true;
});
document.body.addEventListener("keyup", function (e) {
    keys[e.keyCode] = false;
});

Ответ 2

Я думаю, что то, что я сделал бы, это на клавиатуре, не останавливая корабль, просто у меня есть функция, которая немного замедляет ее, а затем вызывает эту функцию в setInterval в любом промежутке, давая желаемый эффект, а затем, когда скорость ship is zero call clearInterval

Итак, на клавиатуре u в основном setup setInterval (slowShip, 500)

Ответ 3

Не могли бы вы просто сделать

if(!playerUp && !playerDown && moveSpeed > 0){
    moveSpeed--;
}

или вам нужна специальная формула для этого?