Задать вопрос
@kamlauka

Как правильно задать анимацию небольшого вращения-"покачивания" в canvas?

Как сделать, чтобы туча вращалась не на 360 градусов, а просто немного покачивалась?
https://codepen.io/kamlauka/pen/oMwqNZ
  • Вопрос задан
  • 367 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 2
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно угол поворота сделать функцией синуса от прошедшего времени. Примерно так:
var ts0;
function draw(ts) {
    // ...
    if(!ts0) ts0 = ts;
    const dt = ts - ts0; // сколько прошло миллисекунд
    //  ...
    ctx.translate(500, 180 + Math.sin(dt/352)*3); 
    ctx.rotate( Math.sin(dt/630) / 40 );
Тут помимо поворота ещё по вертикали слегка покачивается. Так же, плавной синусоидой, но с другим периодом, чтобы не выглядело циклично.

Рабочий пример.

В функцию, вызываемую по requestAnimationFrame() параметром передаётся текущее время, так что можно не заморачиваться с созданием нового объекта Date, а использовать этот параметр.

Из соотношения координат в ctx.drawImage(cloud, -350, -250); с размерами картинки определяется центр, относительно которого получится вращение. Желательно его подобрать так, чтобы они приходился на визуальный центр масс тучи.
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Ну как бы так:

const cloud = new Image();
cloud.src = 'https://avatanplus.com/files/resources/mid/56dc1ba4ba1b81534bcbfb9a.png';

(function draw() {
  const ctx = document.getElementById('canvas').getContext('2d');

  ctx.globalCompositeOperation = 'destination-over';
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  ctx.fillStyle = 'rgba(0,0,0,0.4)';
  ctx.strokeStyle = 'rgba(0,153,255,0.4)';
  ctx.save();
  ctx.translate(300, 200);

  const time = new Date();
  ctx.rotate(Math.sin(time / 500) / 10);

  ctx.drawImage(cloud, -300, -200);
  ctx.restore();

  window.requestAnimationFrame(draw);
})();

Коэффициенты для изменения скорости и амплитуды - их вы, думаю, сможете подобрать самостоятельно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽