function Анимация(элемент, параметры) { this.запустить = function() { let п = параметры; let воспроизведений = Number(п["воспроизведений"]); let скорость = Number(п["скорость"]); let к0 = Number(п["кадр.0"]); let к1 = Number(п["кадр.1"]); let д0 = Number(п["диапазон.0"]); let д1 = Number(п["диапазон.1"]); let д2 = Number(п["диапазон.2"]); let д3 = Number(п["диапазон.3"]); if ( воспроизведений == null || скорость == null || к0 == null || к1 == null || д0 == null || д1 == null || д2 == null || д3 == null ) { return; } let ширинаДиапазона = Math.abs(д2 - д0); let высотаДиапазона = Math.abs(д3 - д1); let ширинаКадра = Math.abs(к0); let высотаКадра = Math.abs(к1); let кадровПоГоризонтали = Math.floor(ширинаДиапазона / ширинаКадра); let кадровПоВертикали = Math.floor(высотаДиапазона / высотаКадра); this.номерВоспроизведения = 0; this.колвоВоспроизведений = воспроизведений; this.размерКадра = [к0, к1]; this.поГоризонтали = кадровПоГоризонтали > кадровПоВертикали; this.номерКадра = 0; this.колвоКадров = this.поГоризонтали ? кадровПоГоризонтали : кадровПоВертикали; // Возможно, в будущем стоит заменить частные таймеры на один общий. // Вдруг в браузерах есть ограничение на количество таймеров от одной страницы. this.таймер = setInterval(() => { this.анимировать(); }, скорость); }; this.остановить = function() { if (this.таймер) { clearInterval(this.таймер); } }; this.анимировать = function() { this.номерКадра += 1; if (this.номерКадра >= this.колвоКадров) { this.номерВоспроизведения += 1; this.номерКадра = 0; if ( this.колвоВоспроизведений > 0 && this.номерВоспроизведения >= this.колвоВоспроизведений ) { this.остановить(); return; } } let x = this.поГоризонтали ? this.номерКадра * this.размерКадра[0] : 0; let y = this.поГоризонтали ? 0 : this.номерКадра * this.размерКадра[1]; элемент.style.backgroundPosition = `${x}px ${y}px`; }; // Конструктор. this.запустить(); }