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.

92 lines
2.9KB

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