You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

83 lines
3.7KB

  1. function Анимация(элемент, параметры)
  2. {
  3. this.запустить = function()
  4. {
  5. let п = параметры;
  6. let воспроизведений = Number(п["воспроизведений"]);
  7. let скорость = Number(п["скорость"]);
  8. let к0 = Number(п["кадр.0"]);
  9. let к1 = Number(п["кадр.1"]);
  10. let д0 = Number(п["диапазон.0"]);
  11. let д1 = Number(п["диапазон.1"]);
  12. let д2 = Number(п["диапазон.2"]);
  13. let д3 = Number(п["диапазон.3"]);
  14. if (
  15. воспроизведений == null ||
  16. скорость == null ||
  17. к0 == null ||
  18. к1 == null ||
  19. д0 == null ||
  20. д1 == null ||
  21. д2 == null ||
  22. д3 == null
  23. ) {
  24. return;
  25. }
  26. let ширинаДиапазона = Math.abs(д2 - д0);
  27. let высотаДиапазона = Math.abs(д3 - д1);
  28. let ширинаКадра = Math.abs(к0);
  29. let высотаКадра = Math.abs(к1);
  30. let кадровПоГоризонтали = Math.floor(ширинаДиапазона / ширинаКадра);
  31. let кадровПоВертикали = Math.floor(высотаДиапазона / высотаКадра);
  32. this.номерВоспроизведения = 0;
  33. this.колвоВоспроизведений = воспроизведений;
  34. this.размерКадра = [к0, к1];
  35. this.поГоризонтали = кадровПоГоризонтали > кадровПоВертикали;
  36. this.номерКадра = 0;
  37. this.колвоКадров = this.поГоризонтали ? кадровПоГоризонтали : кадровПоВертикали;
  38. this.началоДиапазона = [д0, д1];
  39. // Выставляем первоначальное значение в начало диапазона.
  40. элемент.style.backgroundPosition = `${д0}px -${д1}px`;
  41. // Возможно, в будущем стоит заменить частные таймеры на один общий.
  42. // Вдруг в браузерах есть ограничение на количество таймеров от одной страницы.
  43. this.таймер = setInterval(() => { this.анимировать(); }, скорость);
  44. };
  45. this.остановить = function()
  46. {
  47. if (this.таймер)
  48. {
  49. clearInterval(this.таймер);
  50. }
  51. };
  52. this.анимировать = function()
  53. {
  54. this.номерКадра += 1;
  55. if (this.номерКадра >= this.колвоКадров)
  56. {
  57. this.номерВоспроизведения += 1;
  58. this.номерКадра = 0;
  59. if (
  60. this.колвоВоспроизведений > 0 &&
  61. this.номерВоспроизведения >= this.колвоВоспроизведений
  62. ) {
  63. this.остановить();
  64. return;
  65. }
  66. }
  67. let x0 = this.началоДиапазона[0];
  68. let y0 = this.началоДиапазона[1];
  69. let x = this.поГоризонтали ? x0 + this.номерКадра * this.размерКадра[0] : x0;
  70. let y = this.поГоризонтали ? y0 : y0 + this.номерКадра * this.размерКадра[1];
  71. элемент.style.backgroundPosition = `${x}px -${y}px`;
  72. };
  73. // Конструктор.
  74. this.запустить();
  75. }