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

124 lines
4.4KB

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