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