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.

123 lines
4.0KB

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