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

131 lines
4.2KB

  1. function Тела(физмир)
  2. {
  3. this.создать = function()
  4. {
  5. this.умолчание = {
  6. x: 0,
  7. y: 0,
  8. ширина: 40,
  9. высота: 20,
  10. угол: 0,
  11. часть: false,
  12. физика: {
  13. isStatic: true,
  14. },
  15. };
  16. this.задано = {};
  17. this.тела = {};
  18. this.имена = {};
  19. };
  20. this.обработатьКлюч = function(ключ, путь, значение)
  21. {
  22. var имя = путь[1];
  23. var свойство = путь.slice(2).join(".");
  24. if (!this.задано[имя])
  25. {
  26. this.задано[имя] = {};
  27. }
  28. this.задано[имя][свойство] = значение;
  29. this.пересоздатьТело(имя);
  30. };
  31. this.пересоздатьТело = function(имя) {
  32. // Удаляем старое тело.
  33. if (имя in this.тела)
  34. {
  35. var тело = this.тела[имя];
  36. delete this.имена[тело.id];
  37. // Всегда удаляем из мира:
  38. // * тело не часть;
  39. // * тело было не частью, а потом стало частью.
  40. Matter.Composite.remove(физмир, тело);
  41. }
  42. var за = this.задано[имя];
  43. var ум = this.умолчание;
  44. var x = (за.x != null) ? за.x : ум.x;
  45. var y = (за.y != null) ? за.y : ум.y;
  46. var ширина = за.ширина ? за.ширина : ум.ширина;
  47. var высота = за.высота ? за.высота : ум.высота;
  48. // Переводим x,y из левого верхнего угла в центр.
  49. x = x + ширина / 2.0;
  50. y = y + высота / 2.0;
  51. // Параметры тела.
  52. var параметры = {};
  53. Object.assign(параметры, ум.физика);
  54. for (var путь in за)
  55. {
  56. if (путь.startsWith("физика"))
  57. {
  58. var свойство = путь.slice(7);
  59. мир.задать(параметры, свойство, за[путь]);
  60. }
  61. }
  62. var тело = null;
  63. // Создаём новое составное тело.
  64. if (за["части.0"])
  65. {
  66. параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
  67. тело = Matter.Body.create(параметры);
  68. }
  69. // Создаём новое несоставное тело.
  70. else
  71. {
  72. тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
  73. }
  74. this.тела[имя] = тело;
  75. this.имена[тело.id] = имя;
  76. // Добавляем в физический мир, если не часть другого составного мира.
  77. var часть = за.часть ? за.часть : ум.часть;
  78. if (!часть)
  79. {
  80. Matter.Composite.add(физмир, тело);
  81. }
  82. };
  83. this.именаЧастей = function(за)
  84. {
  85. var имена = [];
  86. for (var ключ in за)
  87. {
  88. if (ключ.startsWith("части"))
  89. {
  90. имена.push(за[ключ]);
  91. }
  92. }
  93. return имена;
  94. };
  95. this.телаЧастей = function(имена)
  96. {
  97. var тела = [];
  98. for (var н in имена)
  99. {
  100. var имя = имена[н];
  101. var тело = this.тела[имя];
  102. тела.push(тело);
  103. }
  104. return тела;
  105. };
  106. this.отладить = function()
  107. {
  108. console.debug("Тела.отладить. НАЧАЛО");
  109. for (var имя in this.тела)
  110. {
  111. var тело = this.тела[имя];
  112. console.debug("тело имя/id/позиция:", имя, тело.id, тело.position);
  113. }
  114. console.debug("Тела.отладить. КОНЕЦ");
  115. };
  116. // Конструктор.
  117. this.создать();
  118. }