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.

126 lines
4.8KB

  1. function Анимация(элемент, параметры)
  2. {
  3. this.анимировать = function()
  4. {
  5. this.номерКадра += 1;
  6. if (this.номерКадра >= this.колвоКадров)
  7. {
  8. this.номерВоспроизведения += 1;
  9. this.номерКадра = 0;
  10. if (
  11. this.воспроизведений > 0 &&
  12. this.номерВоспроизведения >= this.воспроизведений
  13. ) {
  14. this.идёт = false;
  15. return;
  16. }
  17. }
  18. let x0 = this.началоДиапазона[0];
  19. let y0 = this.началоДиапазона[1];
  20. let x = this.поГоризонтали ? x0 + this.номерКадра * this.кадр[0] : x0;
  21. let y = this.поГоризонтали ? y0 : y0 + this.номерКадра * this.кадр[1];
  22. элемент.style.backgroundPosition = `${x}px -${y}px`;
  23. };
  24. this.запустить = function()
  25. {
  26. this.идёт = false;
  27. if (!this.разобратьПараметры())
  28. {
  29. return;
  30. }
  31. let ширинаДиапазона = Math.abs(this.диапазоны[0][2] - this.диапазоны[0][0]);
  32. let высотаДиапазона = Math.abs(this.диапазоны[0][3] - this.диапазоны[0][1]);
  33. let ширинаКадра = this.кадр[0];
  34. let высотаКадра = this.кадр[1];
  35. let кадровПоГоризонтали = Math.floor(ширинаДиапазона / ширинаКадра);
  36. let кадровПоВертикали = Math.floor(высотаДиапазона / высотаКадра);
  37. this.номерВоспроизведения = 0;
  38. this.поГоризонтали = кадровПоГоризонтали > кадровПоВертикали;
  39. this.номерКадра = -1;
  40. this.колвоКадров = this.поГоризонтали ? кадровПоГоризонтали : кадровПоВертикали;
  41. this.началоДиапазона = [this.диапазоны[0][0], this.диапазоны[0][1]];
  42. this.номерИтерации = null;
  43. this.идёт = true;
  44. };
  45. this.обновить = function(время)
  46. {
  47. let итерация = Math.floor(время / this.скорость);
  48. if (this.номерИтерации == итерация)
  49. {
  50. return;
  51. }
  52. this.анимировать();
  53. this.номерИтерации = итерация;
  54. };
  55. this.разобратьДиапазоны = function()
  56. {
  57. let ключи = Object.keys(параметры).sort();
  58. let префикс = "диапазоны";
  59. var значения = [];
  60. for (var номер in ключи)
  61. {
  62. let ключ = ключи[номер];
  63. if (ключ.startsWith(префикс))
  64. {
  65. let значение = Number(параметры[ключ]);
  66. if (!isNaN(значение))
  67. {
  68. значения.push(значение);
  69. }
  70. }
  71. }
  72. if (значения.length % 4 == 0)
  73. {
  74. var диапазоны = [];
  75. let колво = значения.length / 4;
  76. for (var д = 0; д < колво; ++д)
  77. {
  78. var диапазон = [];
  79. for (var н = 0; н < 4; ++н)
  80. {
  81. диапазон.push(значения[д * 4 + н]);
  82. }
  83. диапазоны.push(диапазон);
  84. }
  85. return диапазоны;
  86. }
  87. return null;
  88. };
  89. this.разобратьПараметры = function()
  90. {
  91. let п = параметры;
  92. let воспроизведений = Number(п["воспроизведений"]);
  93. let скорость = Number(п["скорость"]);
  94. let к0 = Number(п["кадр.0"]);
  95. let к1 = Number(п["кадр.1"]);
  96. let диапазоны = this.разобратьДиапазоны();
  97. if (
  98. воспроизведений == null ||
  99. скорость == null ||
  100. к0 == null ||
  101. к1 == null ||
  102. диапазоны == null
  103. ) {
  104. return false;
  105. }
  106. this.диапазоны = диапазоны;
  107. this.воспроизведений = воспроизведений;
  108. this.кадр = [к0, к1];
  109. this.скорость = скорость;
  110. return true;
  111. };
  112. // Конструктор.
  113. this.запустить();
  114. }