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.

136 lines
5.1KB

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