У меня есть объект холста, который отображает изображение. Когда пользователь нажимает кнопку, изображение перемещается вправо. Моя проблема в том, что это движение не плавное. Изображение просто прыгает в указанную позицию. Как сделать это движение плавным? Это пример кода Кто-нибудь может мне помочь?
$(window).on('load', function () {
myCanvas();
});
function myCanvas() {
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var x = 0;
function fly() {
ctx.clearRect(0, 0, c.width, c.height);
ctx.closePath();
ctx.beginPath();
var img = new Image();
img.onload = function () {
ctx.drawImage(img, x, 0);
};
img.src = 'http://via.placeholder.com/200x200?text=first';
}
fly();
$('#movebutton').click(function () {
for (i = 0; i < 200; i++) {
x = i;
requestAnimationFrame(fly);
}
});
} <canvas id = "myCanvas" width = "960" height = "600"></canvas>
<button id = "movebutton">Move</button>
<script src = "https://code.jquery.com/jquery-3.3.1.min.js"></script>Кажется, мне нужно тщательное исследование этого...
Мне потребовалось тщательное исследование, но если у вас нет времени и вам разрешено его использовать, я бы предложил вам эту JS-библиотеку: createjs.com/easeljs
Я нашел эту тему полезной stackoverflow.com/questions/43626268/…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прежде всего, почему вы загружаете свое изображение в функцию рендеринга кадров - если кеш отключен, он будет запрашивать изображение каждый кадр!
Я переписал скрипт, чтобы анимация была линейной и плавной, можно редактировать переменную скорости для регулировки скорости движения.
$(window).on('load', function () {
var img = new Image();
img.onload = function () {
myCanvas(img);
};
img.src = 'http://via.placeholder.com/200x200?text=first';
});
function myCanvas(img) {
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var x = 0;
var last_ts = -1
var speed = 0.1
function renderScene() {
ctx.clearRect(0, 0, c.width, c.height);
ctx.closePath();
ctx.beginPath();
ctx.drawImage(img, x, 0);
}
function fly(ts) {
if (last_ts > 0) {
x += speed*(ts - last_ts)
}
last_ts = ts
if (x < 200) {
renderScene()
requestAnimationFrame(fly);
}
}
renderScene()
$('#movebutton').click(function () {
x = 0;
requestAnimationFrame(fly);
});
}
Это сложная тема. То, что вы ищете, называется «интерполяцией». Приходится учитывать частоту кадров и т.д.