Проверить Matter.js
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.

113 lines
3.6KB

  1. function Слежение(корень, изображения, тела, объекты)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. смещение: [0, 0],
  7. скорость: 1,
  8. };
  9. this.задано = {};
  10. };
  11. this.обработатьКлюч = function(ключ, путь, значение)
  12. {
  13. var имя = путь[1];
  14. var свойство = путь.slice(2).join(".");
  15. if (!this.задано[имя])
  16. {
  17. this.задано[имя] = {};
  18. }
  19. this.задано[имя][свойство] = значение;
  20. };
  21. this.обновить = function()
  22. {
  23. for (var имя in this.задано)
  24. {
  25. var за = this.задано[имя];
  26. if (имя == "камера")
  27. {
  28. this.расположитьЭлемент(корень, за, this.расположениеКамеры);
  29. }
  30. else
  31. {
  32. var изо = изображения.элементы[за["изображение"]];
  33. this.расположитьЭлемент(изо, за);
  34. }
  35. }
  36. };
  37. this.расположитьЭлемент = function(элемент, за, формула)
  38. {
  39. var тело = null;
  40. if (за["объект"])
  41. {
  42. тело = объекты.тела[за["объект"]];
  43. }
  44. else if (за["тело"])
  45. {
  46. тело = тела.тела[за["тело"]];
  47. }
  48. var ум = this.умолчание;
  49. // Параметры.
  50. var скорость = за.скорость ? за.скорость : ум.скорость;
  51. var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
  52. var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
  53. // Текущая позиция.
  54. var x0 = 0;
  55. if (элемент.dataset.слежениеX)
  56. {
  57. x0 = элемент.dataset.слежениеX;
  58. }
  59. var y0 = 0;
  60. if (элемент.dataset.слежениеY)
  61. {
  62. y0 = элемент.dataset.слежениеY;
  63. }
  64. // Целевая позиция.
  65. var x1 = тело.position.x + смещениеX;
  66. var y1 = тело.position.y + смещениеY;
  67. // Преобразование целевой позиции.
  68. // Сейчас лишь для камеры.
  69. if (формула)
  70. {
  71. var итог = формула(x1, y1);
  72. x1 = итог[0];
  73. y1 = итог[1];
  74. }
  75. // Устанавливаемая плавно позиция.
  76. var x = this.lerp(x0, x1, скорость);
  77. var y = this.lerp(y0, y1, скорость);
  78. элемент.dataset.слежениеX = x;
  79. элемент.dataset.слежениеY = y;
  80. элемент.style.transform = `translate(${x}px, ${y}px)`;
  81. };
  82. this.расположениеКамеры = function(x, y)
  83. {
  84. return [
  85. window.innerWidth / 2 - x,
  86. window.innerHeight / 2 - y,
  87. ];
  88. };
  89. this.lerp = function(v0, v1, t) {
  90. // Убираем мельтешение.
  91. var delta = Math.abs(v0 - v1);
  92. if (delta < 1) {
  93. return v0;
  94. }
  95. return v0 * (1 - t) + v1 * t;
  96. };
  97. // Конструктор.
  98. this.создать();
  99. };