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

129 lines
4.7KB

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