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.

130 lines
4.9KB

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