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

107 lines
3.8KB

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