У меня есть функция анимации в классе.
Анимация состоит в том, что дерево быстро «вздрагивает» взад и вперед вдоль оси x, как будто его ударило топором.
Что бы я хотел, чтобы произошло:
Когда я нажимаю на дерево, анимация должна начинаться, останавливаться, запускаться, останавливаться, запускаться и затем окончательно останавливаться.На мой взгляд, соотношение между запущенной и остановленной анимацией будет где-то около 2 секунд, а 8 секунд остановлено.Границы, в которых находится анимация, очень малы (см. Последнее утверждение if) со скоростью 4. Поэтому дерево просто очень быстро подпрыгивает между двумя, создавая впечатление «дрожи».
Функция находится внутри класса, который вызывается в функции setup ().Однако tree.shudder () вызывается внутри функции draw (), которая является функцией зацикливания.
Это код с одной итерацией / циклом рабочей анимации:
shudder() {
let d = dist(mouseX, mouseY, this.x, this.y);
let speed = 0;
if (d < 50) {
speed = 4;
if (this.x < this.l || this.x > this.r) {
speed = speed * -1;
}
} else {
speed = 0;
}
this.x = this.x + speed;
}
Анимацияработал, пока я не попытался автоматизировать запуск и остановку дрожания.Когда я добавил переменную counter и функции setInterval / clearInterval, дрожание больше не работает.
Я использую библиотеку p5.
Кто-нибудь может понять, почему моя анимация перестала работать здесь?
function setup() {
createCanvas(windowWidth, windowHeight);
trees = new Trees(200, 200);
}
function draw() {
trees.shudder();
}
shudder() {
let d = dist(mouseX, mouseY, this.x, this.y);
let counter = 0;
let speed = 0;
if (d < 50) {
let interval = setInterval(() => {
speed = 4;
counter++;
console.log(counter);
if (this.x < this.l || this.x > this.r) {
speed = speed * -1;
}
if (counter === 3) {
clearInterval(interval)
}
}, 1000)
} else {
speed = 0;
}
this.x = this.x + speed;
}
В console.log, если я нажимаю на дерево и пропускаю 60 кадров, это происходит:
60trees.js:31 1
trees.js:31 2
trees.js:31 1
trees.js:31 2
2trees.js:31 1
2trees.js:31 2
и работает бесконечно ...
Однако, еслиЯ нажимаю на дерево и щелкаю до того, как пройдет 60 кадров, и я получаю то, что хочу:
26trees.js:31 1
26trees.js:31 2
26trees.js:31 3
Любая помощь будет очень признательна!