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.

86 lines
3.5KB

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