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.

124 lines
4.1KB

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