Проверить Matter.js
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

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