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

115 lines
3.7KB

  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. /**///console.debug("слежение.обновить эл", имя);
  33. var изо = изображения.элементы[за["изображение"]];
  34. this.расположитьЭлемент(изо, за);
  35. }
  36. }
  37. };
  38. this.расположитьЭлемент = function(элемент, за, формула)
  39. {
  40. var тело = null;
  41. if (за["объект"])
  42. {
  43. тело = объекты.тела[за["объект"]];
  44. }
  45. else if (за["тело"])
  46. {
  47. тело = тела.тела[за["тело"]];
  48. }
  49. var ум = this.умолчание;
  50. // Параметры.
  51. var скорость = за.скорость ? за.скорость : ум.скорость;
  52. var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
  53. var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
  54. // Текущая позиция.
  55. var x0 = 0;
  56. if (элемент.dataset.слежениеX)
  57. {
  58. x0 = элемент.dataset.слежениеX;
  59. }
  60. var y0 = 0;
  61. if (элемент.dataset.слежениеY)
  62. {
  63. y0 = элемент.dataset.слежениеY;
  64. }
  65. // Целевая позиция.
  66. var x1 = тело.position.x + смещениеX;
  67. var y1 = тело.position.y + смещениеY;
  68. /**///console.debug("x0/y0:", x0, y0, "x1/y1:", x1, y1);
  69. // Преобразование целевой позиции.
  70. // Сейчас лишь для камеры.
  71. if (формула)
  72. {
  73. var итог = формула(x1, y1);
  74. x1 = итог[0];
  75. y1 = итог[1];
  76. }
  77. // Устанавливаемая плавно позиция.
  78. var x = this.lerp(x0, x1, скорость);
  79. var y = this.lerp(y0, y1, скорость);
  80. элемент.dataset.слежениеX = x;
  81. элемент.dataset.слежениеY = y;
  82. элемент.style.transform = `translate(${x}px, ${y}px)`;
  83. };
  84. this.расположениеКамеры = function(x, y)
  85. {
  86. return [
  87. window.innerWidth / 2 - x,
  88. window.innerHeight / 2 - y,
  89. ];
  90. };
  91. this.lerp = function(v0, v1, t) {
  92. // Убираем мельтешение.
  93. var delta = Math.abs(v0 - v1);
  94. if (delta < 1) {
  95. return v0;
  96. }
  97. return v0 * (1 - t) + v1 * t;
  98. };
  99. // Конструктор.
  100. this.создать();
  101. };