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.

125 lines
4.1KB

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