При клике создаётся объект, после движется к координатам клика. Необходимо сделать плавное движение по диагонали. Сейчас может произойти такая ситуация, что сначала объект дойдёт до конца по Y, а потом идёт по X.
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var bullets = [];
function Bullet(x, y, r, endX, endY) {
this.x = x;
this.y = y;
this.r = r;
this.endX = endX;
this.endY = endY;
this.draw = function() {
ctx.beginPath();
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);
ctx.fill();
if (this.x + 5 < this.endX) {
this.x += 5;
} else {
this.x -= 5;
}
if (this.y + 5 < this.endY) {
this.y += 5;
} else {
this.y -= 5;
}
}
}
function animate() {
requestAnimationFrame(animate);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#000';
ctx.arc(800, 350, 10, 0, Math.PI * 2, false);
ctx.fill();
for (let bullet of bullets) {
bullet.draw();
}
}
window.onclick = function(e) {
bullets.push(new Bullet(800, 350, 10, e.pageX, e.pageY));
}
animate();
#canvas {
border: 1px solid black;
width: 100%;
height: 100%;
}
<canvas id="canvas"></canvas>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
var bullets = [];
function Bullet(x, y, r, endX, endY) {
this.x = x;
this.y = y;
this.r = r;
this.endX = endX;
this.endY = endY;
this.draw = function() {
ctx.beginPath();
ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);
ctx.fill();
if (this.x != this.endX || this.y != this.endY) {
var dx = this.endX - this.x;
var dy = this.endY - this.y;
var d = Math.sqrt(dx*dx + dy*dy);
if (d <= 5) {
this.x = this.endX;
this.y = this.endY;
} else {
this.x += 5 * dx / d;
this.y += 5 * dy / d;
}
}
}
}
function animate() {
requestAnimationFrame(animate);
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#000';
ctx.arc(800, 350, 10, 0, Math.PI * 2, false);
ctx.fill();
for (let bullet of bullets) {
bullet.draw();
}
}
window.onclick = function(e) {
bullets.push(new Bullet(0, 0, 5, e.pageX, e.pageY));
}
animate();
#canvas {
border: 1px solid black;
width: 100%;
height: 100%;
}
<canvas id="canvas"></canvas>
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab