Плавное движение персонажа в игре canvas с помощью клавиш управления
Я создаю боковую прокрутку бесконечной космической тематической игры с использованием 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;
}
}
}
3 ответов
вы просто хотите применить некоторое трение. Это довольно просто. Вы можете сделать что-то вроде следующего.
this.speed*=0.98;
чем меньше значение (0.8, 0.5 и т. д.), тем быстрее вы будет замедляться.
Я предоставил демо, где вы можете перемещаться и постепенно замедляться. Поиграйте со значением и посмотрите, как оно влияет на него.
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;
});
Я думаю, что я бы сделал это на keyup не останавливать корабль, просто есть функция, которая немного замедляет его, а затем вызовите эту функцию в setInterval в любом интервале дает вам желаемый эффект, а затем, как только скорость корабля равна нулю, вызовите clearInterval
Итак, на keyup u в основном setInterval установки (slowShip, 500)
вы можете попробовать уменьшить скорость непрерывно на каждом кадре
if(!playerUp && !playerDown && moveSpeed > 0){
moveSpeed--;
}