Проверить Matter.js
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

107 rindas
3.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. x = x + ширина / 2.0;
  50. y = y + высота / 2.0;
  51. // Параметры тела.
  52. var параметры = {};
  53. Object.assign(параметры, ум.физика);
  54. for (var путь in за)
  55. {
  56. if (путь.startsWith("физика"))
  57. {
  58. var свойство = путь.slice(7);
  59. мир.задать(параметры, свойство, за[путь]);
  60. }
  61. }
  62. var тело = null;
  63. // Создаём новое составное тело.
  64. if (за.части)
  65. {
  66. параметры["parts"] = this.телаЧастей(за.части);
  67. тело = Matter.Body.create(параметры);
  68. }
  69. // Создаём новое несоставное тело.
  70. else
  71. {
  72. тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
  73. }
  74. this.тела[имя] = тело;
  75. this.имена[тело.id] = имя;
  76. // Добавляем в физический мир, если не часть другого составного мира.
  77. var часть = за.часть ? за.часть : ум.часть;
  78. if (!часть)
  79. {
  80. Matter.Composite.add(физмир, тело);
  81. }
  82. };
  83. this.телаЧастей = function(имена)
  84. {
  85. var тела = [];
  86. for (var н in имена)
  87. {
  88. var имя = имена[н];
  89. var тело = this.тела[имя];
  90. тела.push(тело);
  91. }
  92. return тела;
  93. };
  94. // Конструктор.
  95. this.создать();
  96. }