diff --git a/3.3/проигрыватель/140.Тела.js b/3.3/проигрыватель/140.Тела.js
new file mode 100644
index 0000000..0936569
--- /dev/null
+++ b/3.3/проигрыватель/140.Тела.js
@@ -0,0 +1,124 @@
+function Тела(события, физмир)
+{
+ this.создать = function()
+ {
+ this.умолчание = {
+ x: 0,
+ y: 0,
+ ширина: 40,
+ высота: 20,
+ угол: 0,
+ часть: false,
+ физика: {
+ isStatic: true,
+ },
+ };
+
+ this.задано = {};
+ this.тела = {};
+ this.имена = {};
+ события.подписать(this);
+ };
+
+ this.именаЧастей = function(за)
+ {
+ var имена = [];
+ for (var ключ in за)
+ {
+ if (ключ.startsWith("части"))
+ {
+ имена.push(за[ключ]);
+ }
+ }
+ return имена;
+ };
+
+ this.обработатьКлюч = function(ключ, путь, значение)
+ {
+ if (путь[0] != "тела")
+ {
+ return;
+ }
+
+ var имя = путь[1];
+ var свойство = путь.slice(2).join(".");
+ if (!this.задано[имя])
+ {
+ this.задано[имя] = {};
+ }
+ this.задано[имя][свойство] = значение;
+
+ this.пересоздатьТело(имя);
+ };
+
+ this.пересоздатьТело = function(имя) {
+ // Удаляем старое тело.
+ if (имя in this.тела)
+ {
+ var тело = this.тела[имя];
+ delete this.имена[тело.id];
+ // Всегда удаляем из мира: и составные, и несоставные тела.
+ Matter.Composite.remove(физмир, тело);
+ }
+
+ var за = this.задано[имя];
+ var ум = this.умолчание;
+ var x = (за.x != null) ? за.x : ум.x;
+ var y = (за.y != null) ? за.y : ум.y;
+ var ширина = за.ширина ? за.ширина : ум.ширина;
+ var высота = за.высота ? за.высота : ум.высота;
+ // Переводим x,y из левого верхнего угла в центр.
+ x = x + ширина / 2.0;
+ y = y + высота / 2.0;
+ // Параметры тела.
+ var параметры = {};
+ Object.assign(параметры, ум.физика);
+ for (var путь in за)
+ {
+ if (путь.startsWith("физика"))
+ {
+ var свойство = путь.slice(7);
+ мир.задатьПолныйКлюч(параметры, свойство, за[путь]);
+ }
+ }
+
+ var тело = null;
+ // Создаём новое составное тело.
+ if (за["части.0"])
+ {
+ параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
+ тело = Matter.Body.create(параметры);
+ }
+ // Создаём новое несоставное тело.
+ // Вполне может быть частью другого составного тела.
+ else
+ {
+ тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры);
+ }
+ this.тела[имя] = тело;
+ this.имена[тело.id] = имя;
+
+ // Добавляем тело в физический мир, если оно не является частью другого составного тела.
+ var часть = за.часть ? за.часть : ум.часть;
+ if (!часть)
+ {
+ Matter.Composite.add(физмир, тело);
+ }
+ };
+
+ this.телаЧастей = function(имена)
+ {
+ var тела = [];
+ for (var н in имена)
+ {
+ var имя = имена[н];
+ var тело = this.тела[имя];
+ тела.push(тело);
+ }
+ return тела;
+ };
+
+ // Конструктор.
+ this.создать();
+}
+
diff --git a/3.3/проигрыватель/700.Игра.js b/3.3/проигрыватель/700.Игра.js
index ba58beb..0e56a4c 100644
--- a/3.3/проигрыватель/700.Игра.js
+++ b/3.3/проигрыватель/700.Игра.js
@@ -11,6 +11,7 @@ function Игра()
new Изображения(корень),
];
мир.физика = new Физика();
+ мир.тела = new Тела(мир.события, мир.физика.движок.world);
var z64 = мир.параметрыЗапуска()["z64"];
this.исполнитьКод(z64);
diff --git a/3.3/проигрыватель/index.html b/3.3/проигрыватель/index.html
index d1cd8c2..0556def 100644
--- a/3.3/проигрыватель/index.html
+++ b/3.3/проигрыватель/index.html
@@ -23,6 +23,7 @@
+