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.

138 lines
5.1KB

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