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

240.слежение.js 3.5KB

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