Проверить Matter.js
Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

129 Zeilen
4.4KB

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