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

122 lines
4.1KB

  1. мир.платформы = {
  2. умолчание: {
  3. x: 100,
  4. y: 100,
  5. ширина: 40,
  6. высота: 20,
  7. цвет: "#ff0000",
  8. статика: true,
  9. },
  10. задано: {},
  11. тела: {},
  12. элементы: {},
  13. свойстваТела: ["x", "y", "ширина", "высота"],
  14. обновить: обновитьПлатформы,
  15. /*
  16. задатьФизику: задатьФизикуПлатформы,
  17. задатьDiv: задатьDivПлатформы,
  18. */
  19. };
  20. // // // //
  21. мир.ключники.push(function(ключ, путь, значение){
  22. if (!ключ.startsWith("платформы"))
  23. {
  24. return;
  25. }
  26. var имя = путь[1];
  27. var свойство = путь[2];
  28. // Сохранить заданные значения.
  29. if (!(имя in мир.платформы.задано))
  30. {
  31. мир.платформы.задано[имя] = {};
  32. }
  33. мир.платформы.задано[имя][свойство] = значение;
  34. console.debug("задано", мир.платформы.задано[имя]);
  35. // Удалить физическое тело.
  36. if (имя in мир.платформы.тела)
  37. {
  38. var тело = мир.платформы.тела[имя];
  39. Matter.Composite.remove(мир.физика.движок.world, тело);
  40. }
  41. // Пересоздать физическое тело.
  42. var задано = мир.платформы.задано[имя];
  43. var умолчание = мир.платформы.умолчание;
  44. var ширина = задано["ширина"] ? задано["ширина"] : умолчание["ширина"];
  45. var высота = задано["высота"] ? задано["высота"] : умолчание["высота"];
  46. var тело = Matter.Bodies.rectangle(
  47. задано["x"] ? задано["x"] : умолчание["x"],
  48. задано["y"] ? задано["y"] : умолчание["y"],
  49. ширина,
  50. высота,
  51. {
  52. isStatic: ("статика" in задано) ? задано["статика"] : умолчание["статика"],
  53. }
  54. );
  55. console.debug("создать тело", тело);
  56. Matter.Composite.add(мир.физика.движок.world, тело);
  57. мир.платформы.тела[имя] = тело;
  58. // Создать div.
  59. if (!(имя in мир.платформы.элементы))
  60. {
  61. var элемент = document.createElement("div");
  62. элемент.style.position = "absolute";
  63. элемент.style.display = "block";
  64. элемент.style.backgroundColor = умолчание["цвет"];
  65. элемент.style.width = `${ширина}px`;
  66. элемент.style.height = `${высота}px`;
  67. элемент.style.transformOrigin = `center`;
  68. document.body.appendChild(элемент);
  69. мир.платформы.элементы[имя] = элемент;
  70. }
  71. // Обновить div.
  72. var элемент = мир.платформы.элементы[имя];
  73. if (свойство == "ширина")
  74. {
  75. элемент.style.width = `${ширина}px`;
  76. }
  77. else if (свойство == "высота")
  78. {
  79. элемент.style.height = `${высота}px`;
  80. }
  81. else if (свойство == "цвет")
  82. {
  83. элемент.style.backgroundColor = задано["цвет"];
  84. }
  85. });
  86. // // // //
  87. function обновитьПлатформы()
  88. {
  89. for (var имя in мир.платформы.тела)
  90. {
  91. var тело = мир.платформы.тела[имя];
  92. if (тело.isSleeping)
  93. {
  94. continue;
  95. }
  96. var элемент = мир.платформы.элементы[имя];
  97. let x = тело.position.x - элемент.offsetWidth / 2;
  98. let y = тело.position.y - элемент.offsetHeight / 2;
  99. let угол = тело.angle;
  100. элемент.style.transform = `translate(${x}px, ${y}px) rotate(${угол}rad)`;
  101. }
  102. };