Проверить Matter.js
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

161 lines
4.6KB

  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. console.debug("обновитьСлежения");
  28. var за = мир.слежения.задано;
  29. var ум = мир.слежения.умолчание;
  30. for (var имя in за)
  31. {
  32. console.debug("обновитьСлежения. имя:", имя);
  33. var эл = null;
  34. if (имя == "камера")
  35. {
  36. эл = document.getElementById("корень");
  37. }
  38. else
  39. {
  40. эл = элементСлежения(за[имя]);
  41. }
  42. var тело = null;
  43. var имяТела = за[имя]["объект"];
  44. if (имяТела)
  45. {
  46. тело = мир.объекты.тела[имяТела];
  47. }
  48. обновитьЭлемент(эл, тело, за[имя], ум);
  49. }
  50. }
  51. // // // //
  52. function элементСлежения(задано)
  53. {
  54. var id = null;
  55. var изображение = задано["изображение"];
  56. if (изображение)
  57. {
  58. id = мир.изображения.элементы[изображение].id;
  59. }
  60. var эл = document.getElementById(id);
  61. console.debug("элементСлежения. эл:", эл);
  62. return эл;
  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. }