Проверить Matter.js
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

161 行
4.4KB

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