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

133 lines
4.5KB

  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. /**/console.debug("Тела.пересоздатьТ-1 имя:", имя, "x/y/ширина/высота:", x, y, ширина, высота);
  50. x = x + ширина / 2.0;
  51. y = y + высота / 2.0;
  52. /**///console.debug("Тела.пересоздатьТ-2 имя:", имя, "x/y/ширина/высота:", x, y, ширина, высота);
  53. // Параметры тела.
  54. var параметры = {};
  55. Object.assign(параметры, ум.физика);
  56. for (var путь in за)
  57. {
  58. if (путь.startsWith("физика"))
  59. {
  60. var свойство = путь.slice(7);
  61. мир.задать(параметры, свойство, за[путь]);
  62. }
  63. }
  64. var тело = null;
  65. // Создаём новое составное тело.
  66. if (за["части.0"])
  67. {
  68. параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
  69. тело = Matter.Body.create(параметры);
  70. }
  71. // Создаём новое несоставное тело.
  72. else
  73. {
  74. тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
  75. }
  76. this.тела[имя] = тело;
  77. this.имена[тело.id] = имя;
  78. // Добавляем в физический мир, если не часть другого составного мира.
  79. var часть = за.часть ? за.часть : ум.часть;
  80. if (!часть)
  81. {
  82. Matter.Composite.add(физмир, тело);
  83. }
  84. };
  85. this.именаЧастей = function(за)
  86. {
  87. var имена = [];
  88. for (var ключ in за)
  89. {
  90. if (ключ.startsWith("части"))
  91. {
  92. имена.push(за[ключ]);
  93. }
  94. }
  95. return имена;
  96. };
  97. this.телаЧастей = function(имена)
  98. {
  99. var тела = [];
  100. for (var н in имена)
  101. {
  102. var имя = имена[н];
  103. var тело = this.тела[имя];
  104. тела.push(тело);
  105. }
  106. return тела;
  107. };
  108. this.отладить = function()
  109. {
  110. console.debug("Тела.отладить. НАЧАЛО");
  111. for (var имя in this.тела)
  112. {
  113. var тело = this.тела[имя];
  114. console.debug("тело имя/id/позиция:", имя, тело.id, тело.position);
  115. }
  116. console.debug("Тела.отладить. КОНЕЦ");
  117. };
  118. // Конструктор.
  119. this.создать();
  120. }