Browse Source

M-5.0 + документация состояний

master
parent
commit
c1b2a7a32e
56 changed files with 2191 additions and 52 deletions
  1. +53
    -0
      M/5.0/игра.html
  2. +10
    -0
      M/5.0/игра/050.Заголовок.js
  3. +28
    -0
      M/5.0/игра/070.Виды.js
  4. +77
    -0
      M/5.0/игра/075.Анимация.js
  5. +48
    -0
      M/5.0/игра/080.Анимации.js
  6. +183
    -0
      M/5.0/игра/100.Изображения.js
  7. +28
    -0
      M/5.0/игра/120.Физика.js
  8. +149
    -0
      M/5.0/игра/140.Тела.js
  9. +119
    -0
      M/5.0/игра/160.Слежение.js
  10. +170
    -0
      M/5.0/игра/180.Объекты.js
  11. +31
    -0
      M/5.0/игра/190.Состояния.js
  12. +16
    -0
      M/5.0/игра/220.Мышь.js
  13. +60
    -0
      M/5.0/игра/240.Столкновения.js
  14. +100
    -0
      M/5.0/игра/700.Игра.js
  15. +58
    -0
      M/5.0/игра/gr/100.grПодсказки.js
  16. +104
    -0
      M/5.0/игра/gr/200.grМеню.js
  17. +69
    -0
      M/5.0/игра/gr/300.grРеплики.js
  18. +190
    -0
      M/5.0/игра/gr/400.grСцена.js
  19. +1
    -0
      M/5.0/игра/matter-js
  20. +1
    -0
      M/5.0/игра/uikit
  21. +86
    -0
      M/5.0/общее/050.функции.js
  22. +36
    -0
      M/5.0/общее/100.События.js
  23. +72
    -0
      M/5.0/общее/150.Состояние.js
  24. +4
    -0
      M/5.0/общее/200.обёртки.js
  25. +1
    -0
      M/5.0/общее/base64-js
  26. +1
    -0
      M/5.0/общее/pako
  27. +119
    -0
      M/5.0/редактор.html
  28. +127
    -0
      M/5.0/редактор/100.Редактор.js
  29. +53
    -0
      M/5.0/редактор/200.Пульт.js
  30. +13
    -0
      M/5.0/редактор/700.Муром.js
  31. +1
    -0
      M/5.0/редактор/ace
  32. +1
    -0
      M/5.0/редактор/uikit
  33. +5
    -5
      M/doc/ru/animations.html
  34. +3
    -3
      M/doc/ru/animations.md
  35. +4
    -4
      M/doc/ru/bodies.html
  36. +2
    -2
      M/doc/ru/bodies.md
  37. +3
    -3
      M/doc/ru/collisions.html
  38. +1
    -1
      M/doc/ru/collisions.md
  39. +4
    -4
      M/doc/ru/images.html
  40. +2
    -2
      M/doc/ru/images.md
  41. +2
    -2
      M/doc/ru/item.template
  42. +3
    -2
      M/doc/ru/keys.html
  43. +2
    -0
      M/doc/ru/keys.md
  44. +3
    -3
      M/doc/ru/objects.html
  45. +1
    -1
      M/doc/ru/objects.md
  46. +3
    -3
      M/doc/ru/physics.html
  47. +1
    -1
      M/doc/ru/physics.md
  48. +111
    -0
      M/doc/ru/states.html
  49. +15
    -0
      M/doc/ru/states.md
  50. +3
    -3
      M/doc/ru/styles.html
  51. +1
    -1
      M/doc/ru/styles.md
  52. +4
    -3
      M/doc/ru/title.html
  53. +2
    -2
      M/doc/ru/title.md
  54. +4
    -4
      M/doc/ru/tracking.html
  55. +2
    -2
      M/doc/ru/tracking.md
  56. +1
    -1
      M/index.html

+ 53
- 0
M/5.0/игра.html View File

@@ -0,0 +1,53 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<script src="общее/base64-js/base64js.min.js"></script>
<script src="общее/pako/pako.min.js"></script>
<script src="игра/matter-js/matter.min.js"></script>
<link rel="stylesheet" type="text/css" href="игра/uikit/uikit.min.css" />
<script src="игра/uikit/uikit.min.js"></script>
<script src="игра/uikit/uikit-icons.min.js"></script>
<style>
body {
}
#корень
{
position: relative;
}
</style>
</head>
<body>
<div id="заставка"></div>
<div id="корень"></div>
<div id="отладка"></div>

<script src="общее/050.функции.js"></script>
<script src="общее/100.События.js"></script>
<script src="общее/150.Состояние.js"></script>
<script src="общее/200.обёртки.js"></script>

<script src="игра/050.Заголовок.js"></script>
<script src="игра/070.Виды.js"></script>
<script src="игра/075.Анимация.js"></script>
<script src="игра/080.Анимации.js"></script>
<script src="игра/100.Изображения.js"></script>
<script src="игра/120.Физика.js"></script>
<script src="игра/140.Тела.js"></script>
<script src="игра/160.Слежение.js"></script>
<script src="игра/180.Объекты.js"></script>
<script src="игра/190.Состояния.js"></script>
<script src="игра/220.Мышь.js"></script>
<script src="игра/240.Столкновения.js"></script>

<script src="игра/gr/100.grПодсказки.js"></script>
<script src="игра/gr/200.grМеню.js"></script>
<script src="игра/gr/300.grРеплики.js"></script>
<script src="игра/gr/400.grСцена.js"></script>

<script src="игра/700.Игра.js"></script>
<script>
var игра = new Игра();
</script>
</body>
</html>

+ 10
- 0
M/5.0/игра/050.Заголовок.js View File

@@ -0,0 +1,10 @@
function Заголовок()
{
this.обработатьКлюч = function(ключ, путь, значение)
{
if (ключ == "заголовок")
{
document.title = значение;
}
}
}

+ 28
- 0
M/5.0/игра/070.Виды.js View File

@@ -0,0 +1,28 @@
function Виды(события)
{
this.создать = function()
{
this.задано = {};
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "виды")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;

события.уведомить(`виды/${имя}`);
};

// Конструктор.
this.создать();
};

+ 77
- 0
M/5.0/игра/075.Анимация.js View File

@@ -0,0 +1,77 @@
function Анимация(элемент, параметры)
{
this.запустить = function()
{
let п = параметры;
let воспроизведений = Number(п["воспроизведений"]);
let скорость = Number(п["скорость"]);
let к0 = Number(п["кадр.0"]);
let к1 = Number(п["кадр.1"]);
let д0 = Number(п["диапазон.0"]);
let д1 = Number(п["диапазон.1"]);
let д2 = Number(п["диапазон.2"]);
let д3 = Number(п["диапазон.3"]);

if (
воспроизведений == null ||
скорость == null ||
к0 == null ||
к1 == null ||
д0 == null ||
д1 == null ||
д2 == null ||
д3 == null
) {
return;
}

let ширинаДиапазона = Math.abs(д2 - д0);
let высотаДиапазона = Math.abs(д3 - д1);
let ширинаКадра = Math.abs(к0);
let высотаКадра = Math.abs(к1);
let кадровПоГоризонтали = Math.floor(ширинаДиапазона / ширинаКадра);
let кадровПоВертикали = Math.floor(высотаДиапазона / высотаКадра);

this.номерВоспроизведения = 0;
this.колвоВоспроизведений = воспроизведений;
this.размерКадра = [к0, к1];
this.поГоризонтали = кадровПоГоризонтали > кадровПоВертикали;
this.номерКадра = 0;
this.колвоКадров = this.поГоризонтали ? кадровПоГоризонтали : кадровПоВертикали;
// Возможно, в будущем стоит заменить частные таймеры на один общий.
// Вдруг в браузерах есть ограничение на количество таймеров от одной страницы.
this.таймер = setInterval(() => { this.анимировать(); }, скорость);
};

this.остановить = function()
{
if (this.таймер)
{
clearInterval(this.таймер);
}
};

this.анимировать = function()
{
this.номерКадра += 1;
if (this.номерКадра >= this.колвоКадров)
{
this.номерВоспроизведения += 1;
this.номерКадра = 0;
if (
this.колвоВоспроизведений > 0 &&
this.номерВоспроизведения >= this.колвоВоспроизведений
) {
this.остановить();
return;
}
}

let x = this.поГоризонтали ? this.номерКадра * this.размерКадра[0] : 0;
let y = this.поГоризонтали ? 0 : this.номерКадра * this.размерКадра[1];
элемент.style.backgroundPosition = `${x}px ${y}px`;
};

// Конструктор.
this.запустить();
}

+ 48
- 0
M/5.0/игра/080.Анимации.js View File

@@ -0,0 +1,48 @@
function Анимации(события)
{
this.создать = function()
{
this.задано = {};
this.анимации = {};
};

this.запустить = function(имя, элемент)
{
// Останавливаем прошлый экземпляр этой анимации на том же элементе.
this.остановить(имя, элемент);
// Запускаем новый экземпляр анимации на том же элементе.
let ключ = `${элемент.id}`;//-${имя}`;
this.анимации[ключ] = new Анимация(элемент, this.задано[имя]);
}

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "анимации")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;

события.уведомить(`анимации/${имя}`);
};

this.остановить = function(имя, элемент)
{
let ключ = `${элемент.id}`;//-${имя}`;
if (ключ in this.анимации)
{
this.анимации[ключ].остановить();
delete this.анимации[ключ];
}
}

// Конструктор.
this.создать();
};

+ 183
- 0
M/5.0/игра/100.Изображения.js View File

@@ -0,0 +1,183 @@
function Изображения(события, виды, анимации, корень)
{
this.создать = function()
{
this.умолчание = {
пр: [0, 0, 100, 100],
угол: 0,
};
this.задано = {};
this.элементы = {};
события.подписать(this);
};

// Ключи и события.

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] == "изображения")
{
var имя = путь[1];
var свойство = путь.slice(2).join(".");
this.обновитьЭлемент(имя, свойство, значение);
}
};

this.обработатьСобытие = function(событие)
{
let в = "виды/";
let а = "анимации/";
if (событие.startsWith(в))
{
let вид = событие.substring(в.length);
this.обновитьЭлементыВида(вид);
}
else if (событие.startsWith(а))
{
let анимация = событие.substring(а.length);
this.обновитьЭлементыАнимации(анимация);
}
};

this.обновитьЭлементыАнимации = function(анимация)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let зан = за["анимация"];
if (зан && зан == анимация)
{
this.обновитьВидАнимацию(имя, за["вид"], за["анимация"]);
}
}
};

this.обновитьЭлементыВида = function(вид)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let заданныйВид = за["вид"];
if (заданныйВид && заданныйВид == вид)
{
this.обновитьВидАнимацию(имя, за["вид"], за["анимация"]);
}
}
};

// Без вида и анимации.

this.обновитьПозициюРазмерЭлемента = function(имя, эл)
{
let пр = this.пр(имя);
эл.style.left = `${пр[0]}px`;
эл.style.top = `${пр[1]}px`;
эл.style.width = `${пр[2]}px`;
эл.style.height = `${пр[3]}px`;
};

this.пр = function(имя)
{
let за = this.задано[имя];
let пр = this.умолчание.пр;
return [
за["пр.0"] ? за["пр.0"] : пр[0],
за["пр.1"] ? за["пр.1"] : пр[1],
за["пр.2"] ? за["пр.2"] : пр[2],
за["пр.3"] ? за["пр.3"] : пр[3],
];
};

this.создатьИлиПолучитьЭлемент = function(имя)
{
var эл = this.элементы[имя];
if (эл)
{
return эл;
}

var ум = this.умолчание;
эл = document.createElement("div");
эл.id = `изображения-${имя}`;
эл.style.position = "absolute";
эл.style.display = "block";
// Свойства по умолчанию.
this.обновитьПозициюРазмерЭлемента(имя, эл);
эл.style.transform = `rotate(${ум.угол}rad)`;
this.элементы[имя] = эл;
корень.appendChild(эл);
return эл;
};

// Вид и анимация.

this.обновитьУгол = function(имя)
{
var за = this.задано[имя];
var ум = this.умолчание;
var эл = this.элементы[имя];

var угол = за.угол ? за.угол : ум.угол;
var transform = `rotate(${угол}deg) `;

let вид = за["вид"];
if (вид)
{
let виза = виды.задано[вид];
if (виза && виза["transform"])
{
transform += виза["transform"];
}
}

эл.style.transform = transform;
};


this.обновитьВидАнимацию = function(имя, вид, анимация)
{
var эл = this.создатьИлиПолучитьЭлемент(имя);

if (вид)
{
let за = виды.задано[вид];
for (let параметр in за)
{
эл.style.setProperty(параметр, за[параметр]);
}
}

if (анимация)
{
анимации.запустить(анимация, эл);
}

this.обновитьУгол(имя);
};

this.обновитьЭлемент = function(имя, свойство, значение)
{
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
var за = this.задано[имя];
var эл = this.создатьИлиПолучитьЭлемент(имя);

if (свойство.startsWith("пр"))
{
this.обновитьПозициюРазмерЭлемента(имя, эл);
}
else if (
(свойство == "угол") ||
(свойство == "вид") ||
(свойство == "анимация")
) {
this.обновитьВидАнимацию(имя, за["вид"], за["анимация"]);
}
};

// Конструктор.
this.создать();
}

+ 28
- 0
M/5.0/игра/120.Физика.js View File

@@ -0,0 +1,28 @@
function Физика(события)
{
this.создать = function()
{
this.задано = {};
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "физика")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;

события.уведомить(`физика/${имя}`);
};

// Конструктор.
this.создать();
};

+ 149
- 0
M/5.0/игра/140.Тела.js View File

@@ -0,0 +1,149 @@
function Тела(события, физика, физмир)
{
this.создать = function()
{
this.умолчание = {
пр: [0, 0, 40, 20],
части: [],
часть: false,
};

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(событие)
{
let префикс = "физика/";
if (событие.startsWith(префикс))
{
let физ = событие.substring(префикс.length);
this.пересоздатьТелаФизики(физ);
}
};

this.пересоздатьТелаФизики = function(физ)
{
for (let имя in this.задано)
{
let заданнаяФизика = this.задано[имя]["физика"];
if (заданнаяФизика && заданнаяФизика == физ)
{
this.пересоздатьТело(имя);
}
}
};

this.пересоздатьТело = function(имя)
{
// Удаляем старое тело.
if (имя in this.тела)
{
var тело = this.тела[имя];
delete this.имена[тело.id];
// Всегда удаляем из мира: и составные, и несоставные тела.
Matter.Composite.remove(физмир, тело);
}

var за = this.задано[имя];
var ум = this.умолчание;
let пр = this.пр(имя);
// Переводим x,y из левого верхнего угла в центр.
пр[0] = пр[0] + пр[2] / 2.0;
пр[1] = пр[1] + пр[3] / 2.0;
// Параметры тела.
var параметры = {};
if (за.физика)
{
let заф = физика.задано[за.физика];
for (let параметр in заф)
{
мир.задатьПолныйКлюч(параметры, параметр, заф[параметр]);
}
}

var тело = null;
// Создаём новое составное тело.
if (за["части.0"])
{
параметры["parts"] = this.телаЧастей(this.именаЧастей(за));
тело = Matter.Body.create(параметры);
}
// Создаём новое несоставное тело.
// Вполне может быть частью другого составного тела.
else
{
тело = Matter.Bodies.rectangle(пр[0], пр[1], пр[2], пр[3], параметры);
}
this.тела[имя] = тело;
this.имена[тело.id] = имя;

// Добавляем тело в физический мир, если оно не является частью другого составного тела.
var часть = за.часть ? за.часть : ум.часть;
if (!часть)
{
Matter.Composite.add(физмир, тело);
}
};

this.пр = function(имя)
{
let за = this.задано[имя];
let пр = this.умолчание.пр;
return [
за["пр.0"] ? за["пр.0"] : пр[0],
за["пр.1"] ? за["пр.1"] : пр[1],
за["пр.2"] ? за["пр.2"] : пр[2],
за["пр.3"] ? за["пр.3"] : пр[3],
];
};

this.телаЧастей = function(имена)
{
var тела = [];
for (var н in имена)
{
var имя = имена[н];
var тело = this.тела[имя];
тела.push(тело);
}
return тела;
};

// Конструктор.
this.создать();
}


+ 119
- 0
M/5.0/игра/160.Слежение.js View File

@@ -0,0 +1,119 @@
function Слежение(состояние, изображения, тела)
{
this.создать = function()
{
this.умолчание = {
смещение: [0, 0],
скорость: 1,
предел: 0,
};
this.задано = {};
};

this.обновить = function()
{
for (var имя in this.задано)
{
this.расположитьИзображение(имя);
}
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "слежение")
{
return;
}

var имя = путь[1];
var свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};

this.расположитьИзображение = function(имя)
{
let за = this.задано[имя];
let тело = тела.тела[за.тело];
let элемент = изображения.элементы[за.изображение];
if (!тело || !элемент)
{
return;
}

let ум = this.умолчание;

// Параметры.
var скорость = за.скорость ? за.скорость : ум.скорость;
var смещениеX = за["смещение.0"] ? за["смещение.0"] : ум.смещение[0];
var смещениеY = за["смещение.1"] ? за["смещение.1"] : ум.смещение[1];
var предел = за.предел ? за.предел : ум.предел;

// Текущая позиция.
var x0 = 0;
if (элемент.dataset.слежениеX)
{
x0 = элемент.dataset.слежениеX;
}
var y0 = 0;
if (элемент.dataset.слежениеY)
{
y0 = элемент.dataset.слежениеY;
}

// Целевая позиция.
var x1 = тело.position.x + смещениеX;
var y1 = тело.position.y + смещениеY;
// Radians -> Degrees.
var угол = тело.angle * 180 / Math.PI;

// Устанавливаемая плавно позиция.
var x = this.lerp(x0, x1, скорость, предел);
var y = this.lerp(y0, y1, скорость, предел);

// Ничего не делаем, если разница ничтожна.
let ничтожно = 0.00001;
if (
элемент.dataset.слежениеX != null &&
элемент.dataset.слежениеY != null &&
элемент.dataset.слежениеУгол != null &&
Math.abs(элемент.dataset.слежениеX - x) < ничтожно &&
Math.abs(элемент.dataset.слежениеY - y) < ничтожно &&
Math.abs(элемент.dataset.слежениеУгол - угол) < ничтожно
) {
return;
}

// Иначе применяем новые значения.
элемент.dataset.слежениеX = x;
элемент.dataset.слежениеY = y;
элемент.dataset.слежениеУгол = угол;
var описание = {
пр: [x, y],
угол: угол,
};
состояние.разобратьЛишьНовое({
изображения: {
[за.изображение]: описание,
},
});
};

this.lerp = function(v0, v1, t, предел) {
// Убираем мельтешение в случае наличия предела.
if (предел)
{
var delta = Math.abs(v0 - v1);
if (delta < предел) {
return v0;
}
}
return v0 * (1 - t) + v1 * t;
};

// Конструктор.
this.создать();
};

+ 170
- 0
M/5.0/игра/180.Объекты.js View File

@@ -0,0 +1,170 @@
function Объекты(состояние, события)
{
this.создать = function()
{
this.умолчание = {
пр: [0, 0, 40, 20],
};
this.задано = {};
события.подписать(this);
};

// Ключи и события.

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "объекты")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;

let производноеИмя = `объекты-${имя}`;

if (свойство.startsWith("пр."))
{
let пр = this.пр(имя);
this.обновитьПозициюРазмер(производноеИмя, пр);
this.обновитьСлежение(производноеИмя, пр);
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
this.обновитьИзображение(производноеИмя, пр, вид, анимация);
}
else if (свойство == "физика")
{
this.обновитьФизику(производноеИмя, значение);
}
else if (
свойство == "вид" ||
свойство == "анимация"
) {
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
this.обновитьИзображение(производноеИмя, null, вид, анимация);
}
};

this.обработатьСобытие = function(событие)
{
let в = "виды/";
let а = "анимации/";
if (событие.startsWith(в))
{
let вид = событие.substring(в.length);
this.обновитьОбъектыВида(вид);
}
else if (событие.startsWith(а))
{
let анимация = событие.substring(а.length);
this.обновитьОбъектыАнимации(анимация);
}
};

this.обновитьОбъектыАнимации = function(анимация)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let зан = за["анимация"];
if (зан && зан == анимация)
{
this.обновитьВидАнимацию(имя);
}
}
};

this.обновитьОбъектыВида = function(вид)
{
for (let имя in this.задано)
{
let за = this.задано[имя];
let зви = за["вид"];
if (зви && зви == вид)
{
this.обновитьВидАнимацию(имя);
}
}
};

this.обновитьВидАнимацию = function(имя)
{
let вид = this.задано[имя]["вид"];
let анимация = this.задано[имя]["анимация"];
let производноеИмя = `объекты-${имя}`;
this.обновитьИзображение(производноеИмя, null, вид, анимация);
};

this.обновитьИзображение = function(имя, пр, вид, анимация)
{
var описание = {
вид: вид,
анимация: анимация,
};
if (пр)
{
описание["пр"] = пр;
}
состояние.разобрать({
изображения: {
[имя]: описание,
},
});
};

this.обновитьПозициюРазмер = function(имя, пр)
{
состояние.разобрать({
тела: {
[имя]: {
пр: пр,
},
},
});
};

this.обновитьСлежение = function(имя, пр)
{
состояние.разобрать({
слежение: {
[имя]: {
изображение: имя,
тело: имя,
смещение: [-пр[2] / 2, -пр[3] / 2],
},
},
});
};

this.обновитьФизику = function(имя, значение)
{
состояние.разобрать({
тела: {
[имя]: {
физика: значение,
},
},
});
};

this.пр = function(имя)
{
let за = this.задано[имя];
let пр = this.умолчание.пр;
return [
за["пр.0"] ? за["пр.0"] : пр[0],
за["пр.1"] ? за["пр.1"] : пр[1],
за["пр.2"] ? за["пр.2"] : пр[2],
за["пр.3"] ? за["пр.3"] : пр[3],
];
};

// Конструктор.
this.создать();
};

+ 31
- 0
M/5.0/игра/190.Состояния.js View File

@@ -0,0 +1,31 @@
function Состояния(состояние)
{
this.создать = function()
{
this.задано = {};
};

this.применить = function(имя)
{
состояние.разобратьВыпрямленный(this.задано[имя]);
}

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "состояния")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};

// Конструктор.
this.создать();
};

+ 16
- 0
M/5.0/игра/220.Мышь.js View File

@@ -0,0 +1,16 @@
function Мышь(события)
{
this.создать = function()
{
window.addEventListener("click", function(o) {
события.уведомить(`мышь/нажатие/${o.clientX}/${o.clientY}/${o.target.id}`);
});
window.addEventListener("mousemove", function(o) {
события.уведомить(`мышь/перемещение/${o.clientX}/${o.clientY}/${o.target.id}`);
});
};

// Конструктор.
this.создать();
};


+ 60
- 0
M/5.0/игра/240.Столкновения.js View File

@@ -0,0 +1,60 @@
function Столкновения(события, тела, физдвижок)
{
this.создать = function()
{
this.задано = {};
Matter.Events.on(
физдвижок,
"collisionActive",
(событие) => { this.обработатьСтолкновение(событие) }
);
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (путь[0] != "столкновения")
{
return;
}

let имя = путь[1];
let свойство = путь.slice(2).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};

this.обработатьСтолкновение = function(событие)
{
for (var имя in this.задано)
{
var ст = this.задано[имя];
var имя1 = ст["тела.0"];
var имя2 = ст["тела.1"];
if (!имя1 || !имя2 || !ст.событие)
{
continue;
}

var пары = событие.pairs;
for (var номер in пары)
{
var пара = пары[номер];
var п1 = тела.имена[пара.bodyA.id];
var п2 = тела.имена[пара.bodyB.id];
if (
!((имя1 == п1) && (имя2 == п2)) &&
!((имя1 == п2) && (имя2 == п1))
) {
continue;
}
мир.события.уведомить(ст.событие);
}
}
};

// Конструктор.
this.создать();
};

+ 100
- 0
M/5.0/игра/700.Игра.js View File

@@ -0,0 +1,100 @@
function Игра()
{
this.создать = function()
{
мир.физдвижок = Matter.Engine.create({
enableSleeping: true,
gravity: {
y: 2,
},
});
var корень = document.getElementById("корень");
мир.события = new События(мир.uuid);
мир.состояние = new Состояние();
мир.состояние.обработчик = (к, п, з) => { this.обработатьКлюч(к, п, з) };
мир.виды = new Виды(мир.события);
мир.анимации = new Анимации(мир.события);
мир.изображения = new Изображения(мир.события, мир.виды, мир.анимации, корень),
мир.физика = new Физика(мир.события);
мир.тела = new Тела(мир.события, мир.физика, мир.физдвижок.world);
мир.слежение = new Слежение(мир.состояние, мир.изображения, мир.тела);
мир.объекты = new Объекты(мир.состояние, мир.события);
мир.состояниЯ = new Состояния(мир.состояние);
мир.мышь = new Мышь(мир.события);
мир.столкновения = new Столкновения(мир.события, мир.тела, мир.физдвижок);

this.ключники = [
new Заголовок(),
мир.виды,
мир.анимации,
мир.изображения,
мир.физика,
мир.тела,
мир.слежение,
мир.объекты,
мир.состояниЯ,
мир.столкновения,
];

this.настроитьКлючиGR()

var z64 = мир.параметрыЗапуска()["z64"];
this.исполнитьКод(z64);
this.отслеживатьОбновленияКода();
this.обновить();
};

this.исполнитьКод = function(z64)
{
if (z64)
{
var код = мир.изZ64(z64);
eval(код);
}
};

this.настроитьКлючиGR = function()
{
let адресИгры = window.location.pathname + "/../игра.html?z64=";
мир.grСцена = new grСцена(мир.состояние, мир.состояниЯ, мир.события, мир.тела, адресИгры);
this.ключники.push(мир.grСцена);
мир.grПодсказки = new grПодсказки();
this.ключники.push(мир.grПодсказки);
мир.grРеплики = new grРеплики(мир.события);
this.ключники.push(мир.grРеплики);
мир.grМеню = new grМеню(мир.события, мир.grПодсказки, мир.grРеплики);
}

this.обновить = function()
{
Matter.Engine.update(мир.физдвижок);
мир.слежение.обновить();

мир.grСцена.обновить();

var тут = this;
requestAnimationFrame(function() {
тут.обновить();
});
};

this.обработатьКлюч = function(ключ, путь, значение)
{
for (var номер in this.ключники)
{
var ключник = this.ключники[номер];
ключник.обработатьКлюч(ключ, путь, значение);
}
};

this.отслеживатьОбновленияКода = function()
{
var тут = this;
window.addEventListener("message", function(событие) {
тут.исполнитьКод(событие.data);
});
};

// Конструктор.
this.создать();
}

+ 58
- 0
M/5.0/игра/gr/100.grПодсказки.js View File

@@ -0,0 +1,58 @@
function grПодсказки()
{
this.создать = function()
{
this.задано = {};
};

this.задатьПодсказку = function(имя)
{
let за = this.задано[имя];
if (!за.элемент || !за.текст)
{
return;
}

let элемент = document.getElementById(за.элемент);
if (!элемент)
{
return;
}

элемент.setAttribute("uk-tooltip", `pos: right; title: ${за.текст}`);
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.подсказки"))
{
return;
}

let имя = путь[2];
let свойство = путь.slice(3).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;

this.задатьПодсказку(имя);
};

this.подсказкаДляЭлемента = function(элемент)
{
for (var имя in this.задано)
{
let подсказка = this.задано[имя];
if (подсказка.элемент == элемент)
{
return имя;
}
}
return null;
};

// Конструктор.
this.создать();
};

+ 104
- 0
M/5.0/игра/gr/200.grМеню.js View File

@@ -0,0 +1,104 @@
function grМеню(события, подсказки, реплики)
{
this.создать = function()
{
события.подписать(this);
this.установитьМеню();
this.улавливатьВыбор();
};

this.обработатьСобытие = function(событие)
{
let мышь = "мышь/нажатие/";
let сами = "меню/";
if (событие.startsWith(мышь))
{
let значения = событие.substring(мышь.length).split("/");
let элемент = значения[2];
let имя = подсказки.подсказкаДляЭлемента(элемент);
if (имя && имя in реплики.задано)
{
this.отобразитьМеню(имя);
}
}
else if (событие.startsWith(сами))
{
UIkit.modal("#меню").hide();
}
};

this.отобразитьМеню = function(имя)
{
this.активнаяПодсказка = имя;
let подсказка = подсказки.задано[имя];
document.getElementById("меню-заголовок").innerHTML = подсказка.текст;
UIkit.modal("#меню").show();
};

this.улавливатьВыбор = function()
{
var тут = this;
let глаз = document.getElementById("меню-кнопка-глаз");
глаз.addEventListener(
"click",
function() {
события.уведомить(`меню/глаз/${тут.активнаяПодсказка}`);
}
);

let рука = document.getElementById("меню-кнопка-рука");
рука.addEventListener(
"click",
function() {
события.уведомить(`меню/рука/${тут.активнаяПодсказка}`);
}
);

let рот = document.getElementById("меню-кнопка-рот");
рот.addEventListener(
"click",
function() {
события.уведомить(`меню/рот/${тут.активнаяПодсказка}`);
}
);

let нога = document.getElementById("меню-кнопка-нога");
нога.addEventListener(
"click",
function() {
события.уведомить(`меню/нога/${тут.активнаяПодсказка}`);
}
);
};

this.установитьМеню = function()
{
let html = `
<div id="меню" uk-modal>
<div class="uk-modal-dialog uk-modal-body">
<button class="uk-modal-close-default" type="button" uk-close></button>
<h2 id="меню-заголовок" class="uk-modal-title">Заголовок</h2>
<div class="uk-child-width-1-4 uk-text-center" uk-grid>
<div>
<div id="меню-кнопка-глаз" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">👁️</div>
</div>
<div>
<div id="меню-кнопка-рука" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🤚</div>
</div>
<div>
<div id="меню-кнопка-рот" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🗣</div>
</div>
<div>
<div id="меню-кнопка-нога" class="uk-card uk-card-small uk-card-hover uk-card-default uk-card-body">🥾</div>
</div>
</div>
</div>
</div>
`;
document.body.insertAdjacentHTML("beforeend", html);
};

// Конструктор.
this.создать();
};


+ 69
- 0
M/5.0/игра/gr/300.grРеплики.js View File

@@ -0,0 +1,69 @@
function grРеплики(события)
{
this.создать = function()
{
this.задано = {};
события.подписать(this);
};

this.номерРеплики = function(инструмент)
{
if (инструмент == "рука")
{
return 1;
}
else if (инструмент == "рот")
{
return 2;
}
else if (инструмент == "нога")
{
return 3;
}
// "глаз"
return 0;
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.реплики"))
{
return;
}

let имя = путь[2];
let свойство = путь.slice(3).join(".");
if (!this.задано[имя])
{
this.задано[имя] = {};
}
this.задано[имя][свойство] = значение;
};

this.обработатьСобытие = function(событие)
{
let меню = "меню/";
if (событие.startsWith(меню))
{
let значения = событие.substring(меню.length).split("/");
let инструмент = значения[0];
let подсказка = значения[1];
this.отобразитьРеплику(инструмент, подсказка);
}
};

this.отобразитьРеплику = function(инструмент, подсказка)
{
let номер = this.номерРеплики(инструмент);
let реплика = this.задано[подсказка][номер];
let частей = реплика.split(/ /);
let длительность = частей.length * 1000;
UIkit.notification({
message: реплика,
timeout: длительность,
});
};

// Конструктор.
this.создать();
};

+ 190
- 0
M/5.0/игра/gr/400.grСцена.js View File

@@ -0,0 +1,190 @@
function grСцена(состояние, состояниЯ, события, тела, адресИгры)
{
this.создать = function()
{
this.задано = {};
this.сцены = null;
this.состояниеИгрока = null;
события.подписать(this);
};

this.загрузитьСцену = function(имя)
{
let z64 = this.сцены[имя];
window.location = адресИгры + z64;
};

this.загрузитьОглавление = function(адрес)
{
var тут = this;
var запрос = new XMLHttpRequest();
запрос.onreadystatechange = function()
{
if (this.readyState == 4)
{
if (this.status == 200)
{
тут.разобратьОглавление(this.responseText);
}
else
{
console.error("Не удалось загрузить оглавление сцен:", this.status);
}
}
}
запрос.open("GET", адрес);
запрос.send();
};

this.задатьСостояниеИгрока = function(идёт, направление)
{
let стоятьЛ = this.задано["игрок.стоять.0"];
let стоятьП = this.задано["игрок.стоять.1"];
let идтиЛ = this.задано["игрок.идти.0"];
let идтиП = this.задано["игрок.идти.1"];
if (!стоятьЛ || !стоятьП || !идтиЛ || !идтиП)
{
return;
}

var название = идтиЛ;
if (идёт && направление > 0)
{
название = идтиП;
}
else if (!идёт && направление < 0)
{
название = стоятьЛ;
}
else if (!идёт && направление > 0)
{
название = стоятьП;
}

if (this.состояниеИгрока != название)
{
состояниЯ.применить(название);
this.состояниеИгрока = название;
}
};

this.обновить = function()
{
this.переместитьИгрока();
};

this.обработатьКлюч = function(ключ, путь, значение)
{
if (!ключ.startsWith("gr.сцена"))
{
return;
}

var свойство = путь.slice(2).join(".");
this.задано[свойство] = значение;
if (свойство == "оглавление")
{
this.загрузитьОглавление(значение);
}
};
this.обработатьНажатиеМышиУказатьИНажать = function(x, y, указатель)
{
let цель = this.задано["цель"];
if (!this.типИгрыУказатьИНажать() || !цель)
{
return;
}
let тело = тела.тела[цель];
if (!тело)
{
return;
}

var пр = [
тело.bounds.min.x,
тело.bounds.min.y,
тело.bounds.max.x - тело.bounds.min.x,
тело.bounds.max.y - тело.bounds.min.y,
]
let ширина = пр[2];
пр[0] = x - ширина;

состояние.разобрать({
тела: {
[цель]: {
пр: пр,
},
},
});
};

this.обработатьСобытие = function(событие)
{
let мышь = "мышь/нажатие/";
let сцена = "сцена/";
if (событие.startsWith(мышь))
{
let значения = событие.substring(мышь.length).split("/");
let x = Number(значения[0]);
let y = Number(значения[1]);
let указатель = значения[2];
this.обработатьНажатиеМышиУказатьИНажать(x, y, указатель);
}
else if (событие.startsWith(сцена))
{
let название = событие.substring(сцена.length);
this.загрузитьСцену(название);
}
};

this.переместитьИгрока = function()
{
let цель = this.задано["цель"];
let объект = this.задано["игрок.объект"];
let скоростьX = this.задано["игрок.скорость.0"];
if (!this.типИгрыУказатьИНажать() || !цель || !объект || !скоростьX)
{
return;
}

let игрок = `объекты-${объект}`;
let телоЦели = тела.тела[цель];
let телоИгрока = тела.тела[игрок];
if (!телоЦели || !телоИгрока)
{
return;
}

let игрокX = телоИгрока.position.x;
let цельX = телоЦели.position.x;
let ширина = телоЦели.bounds.max.x - телоЦели.bounds.min.x;
let расстояние = цельX - игрокX;
let направление = расстояние > 0 ? 1 : -1;

if (Math.abs(расстояние) < ширина / 2)
{
this.задатьСостояниеИгрока(false, направление);
return;
}

this.задатьСостояниеИгрока(true, направление);
Matter.Sleeping.set(телоИгрока, false);
Matter.Body.setVelocity(телоИгрока, { x: скоростьX * направление, y: 0 });
};

this.разобратьОглавление = function(содержимое)
{
let код = "this.сцены = " + содержимое;
eval(код);
};

this.типИгрыУказатьИНажать = function()
{
var тип = this.задано["тип"];
return тип && тип == "указать и нажать";
};

// Конструктор.
this.создать();
};

+ 1
- 0
M/5.0/игра/matter-js View File

@@ -0,0 +1 @@
../../стороннее/matter-js

+ 1
- 0
M/5.0/игра/uikit View File

@@ -0,0 +1 @@
../../стороннее/uikit

+ 86
- 0
M/5.0/общее/050.функции.js View File

@@ -0,0 +1,86 @@
var мир = {};

мир.uuid = function()
{
// https://stackoverflow.com/a/2117523
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(
/[xy]/g,
function(c)
{
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
}
);
};

мир.вZ64 = function(строка)
{
var байты = new TextEncoder("utf-8").encode(строка);
var архив = pako.deflate(байты, { to: 'string' });
return base64js.fromByteArray(архив);
};

мир.изZ64 = function(строка)
{
var архив = base64js.toByteArray(строка);
var байты = pako.inflate(архив);
return new TextDecoder("utf-8").decode(байты);
};

мир.задатьПолныйКлюч = function(словарь, полныйКлюч, значение) {
var путь = полныйКлюч.split(".");
var пройти = путь.length - 1;
var вложенность = словарь;
for (var номер = 0; номер < пройти; ++номер)
{
var ключ = путь[номер];
if (!(ключ in вложенность))
{
вложенность[ключ] = {};
вложенность = вложенность[ключ];
}
}
// Значение в конце вложенности.
var ключ = путь[пройти];
вложенность[ключ] = значение;
};

мир.назначитьКнопкамСобытия = function(события, список)
{
for (var номер in список)
{
const пара = список[номер];
var кнопка = document.getElementById(пара[0]);
кнопка.addEventListener("click", function(_) {
события.уведомить(пара[1]);
});
}
};

мир.параметрыЗапуска = function()
{
var параметры = {};
var запрос = window.location.search.substring(1);
var аргументы = запрос.split("&");
for (var номер in аргументы)
{
var арг = аргументы[номер];
var позицияЗнака = арг.indexOf("=");
// Лишь ключ.
if (позицияЗнака == -1)
{
var ключ = decodeURIComponent(арг);
параметры[ключ] = null;
}
// Ключ со значением.
else
{
var сыройКлюч = арг.slice(0, позицияЗнака);
var сыроеЗначение = арг.slice(позицияЗнака + 1);
var ключ = decodeURIComponent(сыройКлюч);
var значение = decodeURIComponent(сыроеЗначение);
параметры[ключ] = значение;
}
}
return параметры;
};

+ 36
- 0
M/5.0/общее/100.События.js View File

@@ -0,0 +1,36 @@
function События(uuid)
{
this.создать = function()
{
this.обработчики = [];
this.обработчики = {};
};

this.подписать = function(обработчик, имя)
{
let указатель = имя || uuid();
this.обработчики[указатель] = обработчик;
};

this.отписать = function(обработчик) {
for (var указатель in this.обработчики) {
let обр = this.обработчики[указатель];
if (обр == обработчик)
{
delete this.обработчики[указатель];
return;
}
}
};

this.уведомить = function(событие) {
for (var номер in this.обработчики)
{
var обработчик = this.обработчики[номер];
обработчик.обработатьСобытие(событие);
}
};

// Конструктор.
this.создать();
}

+ 72
- 0
M/5.0/общее/150.Состояние.js View File

@@ -0,0 +1,72 @@
function Состояние()
{
this.создать = function()
{
this.обработчик = null;
this.значения = {};
};

this.выпрямить = function(obj)
{
// https://stackoverflow.com/a/42121920
var newObj = {};
for (var key in obj)
{
if (typeof obj[key] === 'object' && obj[key] !== null)
{
var temp = this.выпрямить(obj[key])
for (var key2 in temp)
{
newObj[key + "." + key2] = temp[key2];
}
}
else
{
newObj[key] = obj[key];
}
}
return newObj;
};

this.лишьНовыеЗначения = function(значения)
{
var новые = {};
for (var ключ in значения)
{
var было = this.значения[ключ];
var стало = значения[ключ];
if (!(было != null && было == стало))
{
новые[ключ] = стало;
}
}
return новые;
};

this.разобрать = function(словарь)
{
this.разобратьВыпрямленный(this.выпрямить(словарь));
};

this.разобратьВыпрямленный = function(выпрямленныйСловарь)
{
for (var ключ in выпрямленныйСловарь)
{
let путь = ключ.split(".");
let значение = выпрямленныйСловарь[ключ];
if (this.обработчик)
{
this.обработчик(ключ, путь, значение);
}
this.значения[ключ] = значение;
}
};

this.разобратьЛишьНовое = function(словарь)
{
this.разобратьВыпрямленный(this.лишьНовыеЗначения(this.выпрямить(словарь)));
};

// Конструктор.
this.создать();
}

+ 4
- 0
M/5.0/общее/200.обёртки.js View File

@@ -0,0 +1,4 @@
мир.разобрать = function(словарь)
{
мир.состояние.разобратьЛишьНовое(словарь);
};

+ 1
- 0
M/5.0/общее/base64-js View File

@@ -0,0 +1 @@
../../стороннее/base64-js

+ 1
- 0
M/5.0/общее/pako View File

@@ -0,0 +1 @@
../../стороннее/pako

+ 119
- 0
M/5.0/редактор.html View File

@@ -0,0 +1,119 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>M-5.0</title>

<script src="общее/base64-js/base64js.min.js"></script>
<script src="общее/pako/pako.min.js"></script>
<script src="редактор/ace/ace.js"></script>
<script src="редактор/ace/mode-javascript.js"></script>
<script src="редактор/ace/worker-javascript.js"></script>
<link rel="stylesheet" type="text/css" href="редактор/uikit/uikit.min.css" />
<script src="редактор/uikit/uikit.min.js"></script>
<script src="редактор/uikit/uikit-icons.min.js"></script>

<style>
#редактор
{
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: calc(50% - 2em);
}
#пульт
{
position: absolute;
left: calc(50% - 2em);
top: 0;
bottom: 0;
width: 4em;
display: flex;
flex-direction: column;
border: 1px dashed gainsboro;
}
#проигрыватель
{
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: calc(50% - 2em);
height: 100%;
border: 0px none;
}

.впульте
{
margin: 0 auto;
}
</style>
</head>
<body>
<div id="редактор"></div>
<div id="пульт">
<span id="ошибка" class="впульте">&nbsp;</span>
<a id="перезапустить" class="впульте uk-icon-button uk-margin-top" uk-icon="refresh" uk-tooltip="Перезапустить"></a>
<a id="отдельно" class="впульте uk-icon-button uk-margin-top" uk-icon="desktop" uk-tooltip="Запустить в отдельной вкладке"></a>
<a id="ссылка" class="впульте uk-icon-button uk-margin-top" uk-icon="link" uk-tooltip="Скопировать ссылку"></a>
<a id="документация" class="впульте uk-icon-button uk-margin-top" uk-icon="question" uk-tooltip="Документация"></a>
<a id="версия" class="впульте uk-icon-button uk-margin-top" uk-icon="git-branch" uk-tooltip="Версия"></a>
<div uk-dropdown="mode: click">
<table class="uk-table">
<tbody>
<tr>
<td>5.0</td>
<td>мир.разобрать, мир.события.подписать, gr.подсказки, gr.реплики, gr.сцена</td>
</tr>
<tr>
<td><a href="../4.1/редактор.html">4.1</a></td>
<td>анимации, подсказки, реплики, состояния, столкновения, сцена</td>
</tr>
<tr>
<td><a href="../4.0/редактор.html">4.0</a></td>
<td>виды, физика; переработанные объекты, изображения, тела</td>
</tr>
<tr>
<td><a href="../3.5/редактор.html">3.5</a></td>
<td>объекты</td>
</tr>
<tr>
<td><a href="../3.4/редактор.html">3.4</a></td>
<td>Документация</td>
</tr>
<tr>
<td><a href="../3.3/редактор/index.html">3.3</a></td>
<td>тела, слежение</td>
</tr>
<tr>
<td><a href="../3.2/редактор/index.html">3.2</a></td>
<td>мир.параметрыЗапуска, мир.разобрать, заголовок, изображения, состояние, физика</td>
</tr>
<tr>
<td><a href="../3.1/редактор/index.html">3.1</a></td>
<td>Кнопки перезапуска, копирования ссылки, запуска в отдельной вкладке</td>
</tr>
<tr>
<td><a href="../3.0/редактор/index.html">3.0</a></td>
<td>Проверка введённого кода на отсутствие синтаксических ошибок</td>
</tr>
</tbody>
</table>
</div>
</div>

<iframe id="проигрыватель" name="проигрыватель"></iframe>
<script src="общее/050.функции.js"></script>
<script src="общее/100.События.js"></script>
<script src="общее/150.Состояние.js"></script>
<script src="общее/200.обёртки.js"></script>
<script src="редактор/100.Редактор.js"></script>
<script src="редактор/200.Пульт.js"></script>
<script src="редактор/700.Муром.js"></script>
<script>
var муром = new Муром();
</script>
</body>
</html>

+ 127
- 0
M/5.0/редактор/100.Редактор.js View File

@@ -0,0 +1,127 @@
function Редактор(события, имяРедактора)
{
this.создать = function()
{
this.первоначальныйЗаголовок = document.title;
this.установитьAce();
this.улавливатьЗавершениеРедактирования();
this.задатьКодПриЗапуске();
события.подписать(this);
};

this.задатьКодПриЗапуске = function()
{
var z64 = мир.параметрыЗапуска()["z64"];
if (z64)
{
var код = мир.изZ64(z64);
this.ace.session.setValue(код);
}
};

this.запуститьОтдельно = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var путь = window.location.pathname + "/../игра.html?z64=" + z64;
window.open(путь);
};

this.исполнитьКод = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
// Исполняем явно код лишь первый раз.
var проигрыватель = document.getElementById("проигрыватель");
if (!проигрыватель.src)
{
проигрыватель.src = "игра.html?z64=" + z64;
}
// После запуска уведомляем iframe о новом коде без перезагрузки.
else
{
window.frames.проигрыватель.postMessage(z64, "*");
}
};

this.обновитьАдреснуюСтрокуИЗаголовок = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var путь = window.location.pathname + "?z64=" + z64;
history.pushState(null, "", путь);
document.title = `${this.первоначальныйЗаголовок} ${z64.length}:${z64.slice(z64.length - 5)}`;
};

this.обработатьСобытие = function(событие)
{
if (событие == "завершили редактирование")
{
this.обновитьАдреснуюСтрокуИЗаголовок();
this.проверитьКорректностьКода();
}
else if (событие == "код корректен")
{
this.исполнитьКод();
}
else if (событие == "перезапустить")
{
this.перезапуститьКод();
}
else if (событие == "запустить отдельно")
{
this.запуститьОтдельно();
}
};

this.перезапуститьКод = function()
{
var содержимое = this.ace.session.getValue();
var z64 = мир.вZ64(содержимое);
var проигрыватель = document.getElementById("проигрыватель");
проигрыватель.src = "игра.html?z64=" + z64;
};

this.проверитьКорректностьКода = function()
{
try
{
eval(this.ace.session.getValue());
события.уведомить("код корректен");
}
catch (ошибка)
{
события.уведомить("код некорректен");
}
};

this.улавливатьЗавершениеРедактирования = function()
{
var тут = this;
this.ace.session.on("change", function(дельта) {
const билет = мир.uuid();
тут.билет = билет;
setTimeout(
function()
{
if (билет == тут.билет)
{
события.уведомить("завершили редактирование");
}
},
300
);
});
};

this.установитьAce = function()
{
var область = document.getElementById(имяРедактора);
this.ace = window.ace.edit(имяРедактора);
this.ace.session.setMode("ace/mode/javascript");
this.ace.session.setUseWrapMode(true);
};

// Конструктор.
this.создать();
}

+ 53
- 0
M/5.0/редактор/200.Пульт.js View File

@@ -0,0 +1,53 @@
function Пульт(события, имяОшибки, имяПерезапуска, имяОтдельно, имяСсылки, имяДокументации)
{
this.создать = function()
{
var ошибка = document.getElementById(имяОшибки);
мир.назначитьКнопкамСобытия(
события,
[
[имяПерезапуска, "перезапустить"],
[имяОтдельно, "запустить отдельно"],
[имяСсылки, "скопировать ссылку"],
[имяДокументации, "открыть документацию"],
]
);
события.подписать(this);
};

this.обработатьСобытие = function(событие)
{
if (событие == "код корректен")
{
this.показатьОшибку(false);
}
else if (событие == "код некорректен")
{
this.показатьОшибку(true);
}
else if (событие == "скопировать ссылку")
{
navigator.clipboard.writeText(window.location)
.then(() => {
UIkit.notification("Скопировали ссылку", { status: "success", timeout: 1000 });
})
.catch(err => {
UIkit.notification("Не удалось скопировать ссылку :(", { status: "danger", timeout: 5000 });
});
}
else if (событие == "открыть документацию")
{
var путь = window.location.pathname + "/../../doc/ru/index.html";
window.open(путь);
}
};


this.показатьОшибку = function(показать)
{
ошибка.innerHTML = показать ? "<span uk-icon=\"icon: warning\"></span>" : "&nbsp;";
};

// Конструктор.
this.создать();
}

+ 13
- 0
M/5.0/редактор/700.Муром.js View File

@@ -0,0 +1,13 @@
function Муром()
{
this.создать = function()
{
мир.события = new События(мир.uuid);
мир.состояние = new Состояние();
мир.редактор = new Редактор(мир.события, "редактор");
мир.пульт = new Пульт(мир.события, "ошибка", "перезапустить", "отдельно", "ссылка", "документация");
};

// Конструктор.
this.создать();
}

+ 1
- 0
M/5.0/редактор/ace View File

@@ -0,0 +1 @@
../../стороннее/ace

+ 1
- 0
M/5.0/редактор/uikit View File

@@ -0,0 +1 @@
../../стороннее/uikit

+ 5
- 5
M/doc/ru/animations.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -102,13 +102,13 @@
</ul>
<p></div><div class="contents"></p>
<p>Пример № 1. Отображение бесконечной анимации на основе вертикальных кадров.</p>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/4.1/редактор.html?z64=eJx9UstOwkAU3fsVk64gKTOlPjMudUtwa4yLAk0hwJTMtGFhSCoLN5oYd34GmiKV8PiFmT/yDsVHR3SSZl7n3jmPyoXMVIJVIidyJlfyRa/UWD2UbvYQDPkqM5mqe4ry/eZsLacqUbcAX0LZ2887PRpesxvwMGYtiqyY90rtKBoISkjQiXA48Fng9X0Rxa1OiEMekG7Imc85qV1e1GuV8/oZ4d6QNLjHmm3S90Tkc8J9Qcx3iRhi0cVhHPU6zMcDFpQt+4vJKF9uJ8AvQckCxN3BnP2nRz6D4ic1NnWBFytArcGiFfSYwX4qU/h053eKHLsIT+F4As1zZ5cUXTk2gNDJsY2qzpHrXhsFc4CmKgGghlTcqosPDg0QEJgDjURT0TlRtO/8KTr7zhRkbYiqx6J0uNO2TPWzhtz1hkrVcTTdLe+dnPKfBMI2nbQMXCEEzeRXxaf3O4MclU8/ABoeIWY="></iframe>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/5.0/редактор.html?z64=eJx9UstOwkAU3fsVk64gKTOlPjMudUtwa4yLAk0hwJTMtGFhSCoLN5oYd34GmiKV8PiFmT/yDsVHR3SSZl7n3jmPyoXMVIJVIidyJlfyRa/UWD2UbvYQDPkqM5mqe4ry/eZsLacqUbcAX0LZ2887PRpesxvwMGYtiqyY90rtKBoISkjQiXA48Fng9X0Rxa1OiEMekG7Imc85qV1e1GuV8/oZ4d6QNLjHmm3S90Tkc8J9Qcx3iRhi0cVhHPU6zMcDFpQt+4vJKF9uJ8AvQckCxN3BnP2nRz6D4ic1NnWBFytArcGiFfSYwX4qU/h053eKHLsIT+F4As1zZ5cUXTk2gNDJsY2qzpHrXhsFc4CmKgGghlTcqosPDg0QEJgDjURT0TlRtO/8KTr7zhRkbYiqx6J0uNO2TPWzhtz1hkrVcTTdLe+dnPKfBMI2nbQMXCEEzeRXxaf3O4MclU8/ABoeIWY="></iframe>
<p></div><div class="contents"></p>
<p>Пример № 2. Отображение конечной анимации.</p>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/4.1/редактор.html?z64=eJx9UstOwkAU3fsVE1aQlJnSiJq61C3BrTEuCjSFAC2ZtmFhSCoLN5oYd34GmiKV8PiFmT/yDMUHIzqZybzOvXPOuSMWIpMJlYmYiJlYiRe1kmP5ULw5IGjiVWQilfc2yfebs7WYykTeAr5E2NvPO9UaTrPr8SD2WzYpxLxXbEfRILQZ8zoRDQau7zl9N4ziViegAfdYN+C+yzmrXV7Ua+Xz+hnjzpA1uOM326zvhJHLGXdDpr/LwiENuzSIo17Hd+nA90oF44vJKF9uJ+CXULKAuDvM2X96xDMUP8mxrgterIBaw6IVcsywn4oUQ2V+t0nF2IWnOJ4gee7s0iZXpkHQT44NUjGPLOtaC5gDmsoEQAUpWxWLHlY1EAjMQSNRVFSdbGKZ5p+qs++iQteGqXzc1Y475ctUvavpXW+4VEG5uqW9l1L+R1Br3ciChtupgeLxK+LT+r11HJVOPwAKGiE+"></iframe>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/5.0/редактор.html?z64=eJx9UstOwkAU3fsVE1aQlJnSiJq61C3BrTEuCjSFAC2ZtmFhSCoLN5oYd34GmiKV8PiFmT/yDMUHIzqZybzOvXPOuSMWIpMJlYmYiJlYiRe1kmP5ULw5IGjiVWQilfc2yfebs7WYykTeAr5E2NvPO9UaTrPr8SD2WzYpxLxXbEfRILQZ8zoRDQau7zl9N4ziViegAfdYN+C+yzmrXV7Ua+Xz+hnjzpA1uOM326zvhJHLGXdDpr/LwiENuzSIo17Hd+nA90oF44vJKF9uJ+CXULKAuDvM2X96xDMUP8mxrgterIBaw6IVcsywn4oUQ2V+t0nF2IWnOJ4gee7s0iZXpkHQT44NUjGPLOtaC5gDmsoEQAUpWxWLHlY1EAjMQSNRVFSdbGKZ5p+qs++iQteGqXzc1Y475ctUvavpXW+4VEG5uqW9l1L+R1Br3ciChtupgeLxK+LT+r11HJVOPwAKGiE+"></iframe>
<p></div><div class="contents"></p>
<p>Пример № 3. Отображение анимации на объекте.</p>
<iframe style="width: 100%; height: 50em" src="../../MYPOM/4.1/редактор.html?z64=eJy9k01r2zAYx+/5FMLskEJiOW66DZed1mtoYadSBnFT47pJ7CDL9FACbjZaWAult36MLKRLluXlK0jfqH8l2RLbyQo7TCBLlp+X31/P44bDiYzFs7yWX2SM5x35QLRzzluhRanrcT1oOb5rN52QR2deoAfMpfWA+Q5jtHJ8dFgpHhx+pMy+pKfM9mvntGmH3GGUOaG2n8uJsRjKWEeKrhiIqfiudrIj7/NXOYIhemIo+vLOIov3+dkMPGCB+QRuP9a/qXFq1+ouCyL/zCLViDXyb66SEto0HYKGl3pY14OINzzf0Vu+u1Mt/AnaXm3FFE4TuPVE91/yrrnrF61NWZaL/ArhA8xRMhHidNQNZb+o4YWfuM29mkU4i5xtsaF4Av8x4txgHf7tcsUTrv9RdtKZoEBpmUHhdE7aE8+ij6ki/7SIUUia93HcRfBFmScWOTEKMCLv3xVIyXhrmp9TDlCHzDEMlUnRLJl6eS9lBIARMGKFoprGIrvGVtGqub4BcATLZD8NcDoWv+RDRuRsDgDMsmEozsUzjTrvUYto69XVUqSJcmrJKmqbW22kfg1c2VDebgfbVUjlvf+I9crft0IrloxlgTcWb8WXiphiTHarKlLG43eTZomxtHf2XwCqqPHz"></iframe>
<iframe style="width: 100%; height: 50em" src="../../MYPOM/5.0/редактор.html?z64=eJy9k01r2zAYx+/5FMLskEJiOW66DZed1mtoYadSBnFT47pJ7CDL9FACbjZaWAult36MLKRLluXlK0jfqH8l2RLbyQo7TCBLlp+X31/P44bDiYzFs7yWX2SM5x35QLRzzluhRanrcT1oOb5rN52QR2deoAfMpfWA+Q5jtHJ8dFgpHhx+pMy+pKfM9mvntGmH3GGUOaG2n8uJsRjKWEeKrhiIqfiudrIj7/NXOYIhemIo+vLOIov3+dkMPGCB+QRuP9a/qXFq1+ouCyL/zCLViDXyb66SEto0HYKGl3pY14OINzzf0Vu+u1Mt/AnaXm3FFE4TuPVE91/yrrnrF61NWZaL/ArhA8xRMhHidNQNZb+o4YWfuM29mkU4i5xtsaF4Av8x4txgHf7tcsUTrv9RdtKZoEBpmUHhdE7aE8+ij6ki/7SIUUia93HcRfBFmScWOTEKMCLv3xVIyXhrmp9TDlCHzDEMlUnRLJl6eS9lBIARMGKFoprGIrvGVtGqub4BcATLZD8NcDoWv+RDRuRsDgDMsmEozsUzjTrvUYto69XVUqSJcmrJKmqbW22kfg1c2VDebgfbVUjlvf+I9crft0IrloxlgTcWb8WXiphiTHarKlLG43eTZomxtHf2XwCqqPHz"></iframe>
<p></div></p>
</div>
</center>


+ 3
- 3
M/doc/ru/animations.md View File

@@ -13,19 +13,19 @@ Lang: ru

Пример № 1. Отображение бесконечной анимации на основе вертикальных кадров.

<iframe style="width: 100%; height: 30em" src="../../MYPOM/4.1/редактор.html?z64=eJx9UstOwkAU3fsVk64gKTOlPjMudUtwa4yLAk0hwJTMtGFhSCoLN5oYd34GmiKV8PiFmT/yDsVHR3SSZl7n3jmPyoXMVIJVIidyJlfyRa/UWD2UbvYQDPkqM5mqe4ry/eZsLacqUbcAX0LZ2887PRpesxvwMGYtiqyY90rtKBoISkjQiXA48Fng9X0Rxa1OiEMekG7Imc85qV1e1GuV8/oZ4d6QNLjHmm3S90Tkc8J9Qcx3iRhi0cVhHPU6zMcDFpQt+4vJKF9uJ8AvQckCxN3BnP2nRz6D4ic1NnWBFytArcGiFfSYwX4qU/h053eKHLsIT+F4As1zZ5cUXTk2gNDJsY2qzpHrXhsFc4CmKgGghlTcqosPDg0QEJgDjURT0TlRtO/8KTr7zhRkbYiqx6J0uNO2TPWzhtz1hkrVcTTdLe+dnPKfBMI2nbQMXCEEzeRXxaf3O4MclU8/ABoeIWY="></iframe>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/5.0/редактор.html?z64=eJx9UstOwkAU3fsVk64gKTOlPjMudUtwa4yLAk0hwJTMtGFhSCoLN5oYd34GmiKV8PiFmT/yDsVHR3SSZl7n3jmPyoXMVIJVIidyJlfyRa/UWD2UbvYQDPkqM5mqe4ry/eZsLacqUbcAX0LZ2887PRpesxvwMGYtiqyY90rtKBoISkjQiXA48Fng9X0Rxa1OiEMekG7Imc85qV1e1GuV8/oZ4d6QNLjHmm3S90Tkc8J9Qcx3iRhi0cVhHPU6zMcDFpQt+4vJKF9uJ8AvQckCxN3BnP2nRz6D4ic1NnWBFytArcGiFfSYwX4qU/h053eKHLsIT+F4As1zZ5cUXTk2gNDJsY2qzpHrXhsFc4CmKgGghlTcqosPDg0QEJgDjURT0TlRtO/8KTr7zhRkbYiqx6J0uNO2TPWzhtz1hkrVcTTdLe+dnPKfBMI2nbQMXCEEzeRXxaf3O4MclU8/ABoeIWY="></iframe>

</div><div class="contents">

Пример № 2. Отображение конечной анимации.

<iframe style="width: 100%; height: 30em" src="../../MYPOM/4.1/редактор.html?z64=eJx9UstOwkAU3fsVE1aQlJnSiJq61C3BrTEuCjSFAC2ZtmFhSCoLN5oYd34GmiKV8PiFmT/yDMUHIzqZybzOvXPOuSMWIpMJlYmYiJlYiRe1kmP5ULw5IGjiVWQilfc2yfebs7WYykTeAr5E2NvPO9UaTrPr8SD2WzYpxLxXbEfRILQZ8zoRDQau7zl9N4ziViegAfdYN+C+yzmrXV7Ua+Xz+hnjzpA1uOM326zvhJHLGXdDpr/LwiENuzSIo17Hd+nA90oF44vJKF9uJ+CXULKAuDvM2X96xDMUP8mxrgterIBaw6IVcsywn4oUQ2V+t0nF2IWnOJ4gee7s0iZXpkHQT44NUjGPLOtaC5gDmsoEQAUpWxWLHlY1EAjMQSNRVFSdbGKZ5p+qs++iQteGqXzc1Y475ctUvavpXW+4VEG5uqW9l1L+R1Br3ciChtupgeLxK+LT+r11HJVOPwAKGiE+"></iframe>
<iframe style="width: 100%; height: 30em" src="../../MYPOM/5.0/редактор.html?z64=eJx9UstOwkAU3fsVE1aQlJnSiJq61C3BrTEuCjSFAC2ZtmFhSCoLN5oYd34GmiKV8PiFmT/yDMUHIzqZybzOvXPOuSMWIpMJlYmYiJlYiRe1kmP5ULw5IGjiVWQilfc2yfebs7WYykTeAr5E2NvPO9UaTrPr8SD2WzYpxLxXbEfRILQZ8zoRDQau7zl9N4ziViegAfdYN+C+yzmrXV7Ua+Xz+hnjzpA1uOM326zvhJHLGXdDpr/LwiENuzSIo17Hd+nA90oF44vJKF9uJ+CXULKAuDvM2X96xDMUP8mxrgterIBaw6IVcsywn4oUQ2V+t0nF2IWnOJ4gee7s0iZXpkHQT44NUjGPLOtaC5gDmsoEQAUpWxWLHlY1EAjMQSNRVFSdbGKZ5p+qs++iQteGqXzc1Y475ctUvavpXW+4VEG5uqW9l1L+R1Br3ciChtupgeLxK+LT+r11HJVOPwAKGiE+"></iframe>

</div><div class="contents">

Пример № 3. Отображение анимации на объекте.

<iframe style="width: 100%; height: 50em" src="../../MYPOM/4.1/редактор.html?z64=eJy9k01r2zAYx+/5FMLskEJiOW66DZed1mtoYadSBnFT47pJ7CDL9FACbjZaWAult36MLKRLluXlK0jfqH8l2RLbyQo7TCBLlp+X31/P44bDiYzFs7yWX2SM5x35QLRzzluhRanrcT1oOb5rN52QR2deoAfMpfWA+Q5jtHJ8dFgpHhx+pMy+pKfM9mvntGmH3GGUOaG2n8uJsRjKWEeKrhiIqfiudrIj7/NXOYIhemIo+vLOIov3+dkMPGCB+QRuP9a/qXFq1+ouCyL/zCLViDXyb66SEto0HYKGl3pY14OINzzf0Vu+u1Mt/AnaXm3FFE4TuPVE91/yrrnrF61NWZaL/ArhA8xRMhHidNQNZb+o4YWfuM29mkU4i5xtsaF4Av8x4txgHf7tcsUTrv9RdtKZoEBpmUHhdE7aE8+ij6ki/7SIUUia93HcRfBFmScWOTEKMCLv3xVIyXhrmp9TDlCHzDEMlUnRLJl6eS9lBIARMGKFoprGIrvGVtGqub4BcATLZD8NcDoWv+RDRuRsDgDMsmEozsUzjTrvUYto69XVUqSJcmrJKmqbW22kfg1c2VDebgfbVUjlvf+I9crft0IrloxlgTcWb8WXiphiTHarKlLG43eTZomxtHf2XwCqqPHz"></iframe>
<iframe style="width: 100%; height: 50em" src="../../MYPOM/5.0/редактор.html?z64=eJy9k01r2zAYx+/5FMLskEJiOW66DZed1mtoYadSBnFT47pJ7CDL9FACbjZaWAult36MLKRLluXlK0jfqH8l2RLbyQo7TCBLlp+X31/P44bDiYzFs7yWX2SM5x35QLRzzluhRanrcT1oOb5rN52QR2deoAfMpfWA+Q5jtHJ8dFgpHhx+pMy+pKfM9mvntGmH3GGUOaG2n8uJsRjKWEeKrhiIqfiudrIj7/NXOYIhemIo+vLOIov3+dkMPGCB+QRuP9a/qXFq1+ouCyL/zCLViDXyb66SEto0HYKGl3pY14OINzzf0Vu+u1Mt/AnaXm3FFE4TuPVE91/yrrnrF61NWZaL/ArhA8xRMhHidNQNZb+o4YWfuM29mkU4i5xtsaF4Av8x4txgHf7tcsUTrv9RdtKZoEBpmUHhdE7aE8+ij6ki/7SIUUia93HcRfBFmScWOTEKMCLv3xVIyXhrmp9TDlCHzDEMlUnRLJl6eS9lBIARMGKFoprGIrvGVtGqub4BcATLZD8NcDoWv+RDRuRsDgDMsmEozsUzjTrvUYto69XVUqSJcmrJKmqbW22kfg1c2VDebgfbVUjlvf+I9crft0IrloxlgTcWb8WXiphiTHarKlLG43eTZomxtHf2XwCqqPHz"></iframe>

</div>


+ 4
- 4
M/doc/ru/bodies.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -98,12 +98,12 @@
<p>Тело представляет из себя сущность Matter.js с полной поддержкой свойств, которые можно указывать телам в Matter.js.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Отображение статичной платформы и падающего на неё самовара.</p>
<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<p></div><div class="contents"></p>
<p>Пример № 2. Составное тело с сенсором и статичная платформа.</p>
<p><strong>ВНИМАНИЕ</strong>: на текущий момент слежение некорректно отрабатывает для составных объектов,
т.к. сенсор должен находиться строго под основанием самовара.</p>
<iframe style="width: 100%; height: 80em" src="../../4.0/редактор.html?z64=eJytVM1q20AQvvspFtFCTGWtTJpCFfoUPYZAFEUoSmxJrNb0EAyym1JKCr32VvoGjokbk9jKK8y+UWclxdFGPymmi7SSVrPzzffNzA5cTkQCCzERn0WC8xX5QLRTzqPYotTzuRFGbuDZQzfmoxM/NELm0fOQBS5jdHgWU2Z/osfMDpxTOrRj7jIqEm2/04EVLEVioO8Z3EIK1/JNTMX3nYsOwQFzWMKNuLJI/p2tpWICazSew6y8Lsex7Zx7LBwFJxY5GrHBzqsLNe4xxe1TuEe8G7iDGS17M84ir3ukbzyOn17RaIbBZmYi2QZ2jt/fYElVT0YUeF0ShD3mRq7NSeywcDAg5mt5UeKEAbf9oBpT8RCXqM8t3neqFog5lUJW/8jhxx+5zX3HIpyN3Ca+C1jjnFbZ4nY3iEPWsL14ZIEVGYU/0hum+oeSyNzil8wG5vxSYsFKTXZm9yBjOOibOtkzcXorp755qKtWWalYRCtnVKslVwD/LieiqtIGNsPVyS7e7xpR1bS+gLuRth31fcazDbWd62ORTBHwXoWCB1X1lkBaVVcLUFPrrl6FzCZF+GtptZXq4iuCTOQ5sWUJ/5PKzSi1zJ/Qmni3HSEq74ZIYIkmmiqgpj8DP2ysgwnuWTz2IizUAwNX1uJL1q0/8zIto9TUR01/S59afXdpzxjlNZm2dU4R1yo7ODf+D3r9PZ30ds0qzyYirf32Io3S5v9IIudA3mBf1SZs3N3/C7eNDLk="></iframe>
<iframe style="width: 100%; height: 80em" src="../../MYPOM/5.0/редактор.html?z64=eJytVM1q20AQvvspFtFCTGWtTJpCFfoUPYZAFEUoSmxJrNb0EAyym1JKCr32VvoGjokbk9jKK8y+UWclxdFGPymmi7SSVrPzzffNzA5cTkQCCzERn0WC8xX5QLRTzqPYotTzuRFGbuDZQzfmoxM/NELm0fOQBS5jdHgWU2Z/osfMDpxTOrRj7jIqEm2/04EVLEVioO8Z3EIK1/JNTMX3nYsOwQFzWMKNuLJI/p2tpWICazSew6y8Lsex7Zx7LBwFJxY5GrHBzqsLNe4xxe1TuEe8G7iDGS17M84ir3ukbzyOn17RaIbBZmYi2QZ2jt/fYElVT0YUeF0ShD3mRq7NSeywcDAg5mt5UeKEAbf9oBpT8RCXqM8t3neqFog5lUJW/8jhxx+5zX3HIpyN3Ca+C1jjnFbZ4nY3iEPWsL14ZIEVGYU/0hum+oeSyNzil8wG5vxSYsFKTXZm9yBjOOibOtkzcXorp755qKtWWalYRCtnVKslVwD/LieiqtIGNsPVyS7e7xpR1bS+gLuRth31fcazDbWd62ORTBHwXoWCB1X1lkBaVVcLUFPrrl6FzCZF+GtptZXq4iuCTOQ5sWUJ/5PKzSi1zJ/Qmni3HSEq74ZIYIkmmiqgpj8DP2ysgwnuWTz2IizUAwNX1uJL1q0/8zIto9TUR01/S59afXdpzxjlNZm2dU4R1yo7ODf+D3r9PZ30ds0qzyYirf32Io3S5v9IIudA3mBf1SZs3N3/C7eNDLk="></iframe>
<p></div></p>
</div>
</center>


+ 2
- 2
M/doc/ru/bodies.md View File

@@ -12,7 +12,7 @@ Lang: ru

Пример № 1. Отображение статичной платформы и падающего на неё самовара.

<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>

</div><div class="contents">

@@ -21,7 +21,7 @@ Lang: ru
**ВНИМАНИЕ**: на текущий момент слежение некорректно отрабатывает для составных объектов,
т.к. сенсор должен находиться строго под основанием самовара.

<iframe style="width: 100%; height: 80em" src="../../4.0/редактор.html?z64=eJytVM1q20AQvvspFtFCTGWtTJpCFfoUPYZAFEUoSmxJrNb0EAyym1JKCr32VvoGjokbk9jKK8y+UWclxdFGPymmi7SSVrPzzffNzA5cTkQCCzERn0WC8xX5QLRTzqPYotTzuRFGbuDZQzfmoxM/NELm0fOQBS5jdHgWU2Z/osfMDpxTOrRj7jIqEm2/04EVLEVioO8Z3EIK1/JNTMX3nYsOwQFzWMKNuLJI/p2tpWICazSew6y8Lsex7Zx7LBwFJxY5GrHBzqsLNe4xxe1TuEe8G7iDGS17M84ir3ukbzyOn17RaIbBZmYi2QZ2jt/fYElVT0YUeF0ShD3mRq7NSeywcDAg5mt5UeKEAbf9oBpT8RCXqM8t3neqFog5lUJW/8jhxx+5zX3HIpyN3Ca+C1jjnFbZ4nY3iEPWsL14ZIEVGYU/0hum+oeSyNzil8wG5vxSYsFKTXZm9yBjOOibOtkzcXorp755qKtWWalYRCtnVKslVwD/LieiqtIGNsPVyS7e7xpR1bS+gLuRth31fcazDbWd62ORTBHwXoWCB1X1lkBaVVcLUFPrrl6FzCZF+GtptZXq4iuCTOQ5sWUJ/5PKzSi1zJ/Qmni3HSEq74ZIYIkmmiqgpj8DP2ysgwnuWTz2IizUAwNX1uJL1q0/8zIto9TUR01/S59afXdpzxjlNZm2dU4R1yo7ODf+D3r9PZ30ds0qzyYirf32Io3S5v9IIudA3mBf1SZs3N3/C7eNDLk="></iframe>
<iframe style="width: 100%; height: 80em" src="../../MYPOM/5.0/редактор.html?z64=eJytVM1q20AQvvspFtFCTGWtTJpCFfoUPYZAFEUoSmxJrNb0EAyym1JKCr32VvoGjokbk9jKK8y+UWclxdFGPymmi7SSVrPzzffNzA5cTkQCCzERn0WC8xX5QLRTzqPYotTzuRFGbuDZQzfmoxM/NELm0fOQBS5jdHgWU2Z/osfMDpxTOrRj7jIqEm2/04EVLEVioO8Z3EIK1/JNTMX3nYsOwQFzWMKNuLJI/p2tpWICazSew6y8Lsex7Zx7LBwFJxY5GrHBzqsLNe4xxe1TuEe8G7iDGS17M84ir3ukbzyOn17RaIbBZmYi2QZ2jt/fYElVT0YUeF0ShD3mRq7NSeywcDAg5mt5UeKEAbf9oBpT8RCXqM8t3neqFog5lUJW/8jhxx+5zX3HIpyN3Ca+C1jjnFbZ4nY3iEPWsL14ZIEVGYU/0hum+oeSyNzil8wG5vxSYsFKTXZm9yBjOOibOtkzcXorp755qKtWWalYRCtnVKslVwD/LieiqtIGNsPVyS7e7xpR1bS+gLuRth31fcazDbWd62ORTBHwXoWCB1X1lkBaVVcLUFPrrl6FzCZF+GtptZXq4iuCTOQ5sWUJ/5PKzSi1zJ/Qmni3HSEq74ZIYIkmmiqgpj8DP2ysgwnuWTz2IizUAwNX1uJL1q0/8zIto9TUR01/S59afXdpzxjlNZm2dU4R1yo7ODf+D3r9PZ30ds0qzyYirf32Io3S5v9IIudA3mBf1SZs3N3/C7eNDLk="></iframe>

</div>


+ 3
- 3
M/doc/ru/collisions.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -97,7 +97,7 @@
<p>Определение столкновения двух физических тел с последующей отправкой события.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Отображение факта столкновения кирпича с землёй с помощью встроенной библиотеки <a href="https://getuikit.com/">UIkit</a>.</p>
<iframe style="width: 100%; height: 52em" src="../../MYPOM/4.1/редактор.html?z64=eJyVlEFr2zAUx+/+FJpOMaRWyraLQ07tpYfSwthhlB1c13HUrHaQZXoYgSQMBuugx8Fgg7Iv0JaahLRLv8LTN9qTnaaS08IqsCzLj/f+/5/9BHcwUyNPjeASprCAK71SE/W98dkhOOAaZnCjznxSPZd7CzWGvxh8DZfmvh6HQdiPRZonRz6hufjU6Ek5yHzGYi69dBAlcXASZTI/4qmXipj1U5FEQrDdD/t7uxvbe1tMBKfsUARJ2GMnQSYjwUSUMbOmdzyIXdpc1R1Wy+VNfUHFU7zmtjo1VhNtbf2NHjx7JwPJQ59IkUfP5S4BfYMC5ojIZjLF3Tu4Vef1zHCvRj45aDXJmxZOr/W02frYtINKzIjM9EntGNsYtf2s4yjTzvXXhXucvz6ja7PSo+W91RJfKKzGXmtawC3WrUILvM9sJqYm+IW/3Y+KHBR1hZirwH00e0Bt8huPuGmTrL00KtCaHzShg89KboX2ZQY/5Wvoth3H6eZJKHmaEPhT2rrBNLp1sFPgN/w0LBUN16l8yB7PvIeegiskOKl6Cy5MEaRDHrI3bHlumeYRCu+SWgTpdGoW3FW0DfP9Th87MEkl7/IwKItRuHjqc0HxiqLnFYkKRNsZOg4sTwtDgzr3sPICgej64+XhkUSn/0XKbf8DaaUD7w=="></iframe>
<iframe style="width: 100%; height: 52em" src="../../MYPOM/5.0/редактор.html?z64=eJyVlEFr2zAUx+/+FJpOMaRWyraLS07dZYfSwthhlB1c13HUrHaQZXoYgSQbDNZBj4NCC2VfoC01CWmXfoWnb7QnO00lp4VOYNmWHu/9/z/5Ge5gqoaeGsIlTGAOV/pJjdWvxleH4IBrmMKNOvZJ9V6uzdUI/mLwNVya63rsBWEvFmme7PuE5uJLoytlP/MZi7n00n6UxMFhlMl8n6deKmLWS0USCcG2Pu1sb629295kIjhieyJIwi47DDIZCSaijJk1vYN+7NLmsu6gelzc1HdUPMFrZqtTIzXW1lZ39ODZBxlIHvpEijx6LncJ6CcUMENENpMJrt7BrTqpZ4Z7NfTJbqtJ3rRweq2n9dbnph1UYkZkpk9qx9jGqO1nFUeZdqZPF+5x/vGMrvVKj5b3Vkv8T2E19lrTHG6xbhVa4H1qMzE1wRl+dr8rclDUFWKuAtfR7C61ya894qZNsrJpVKA1P2hCBx+X3Artywx+ytfA3XAcp5MnoeRpQuBPaesG0+jWwU6Bczg1LBUN16l8yC7PvIeegiskOK56Cy5MEaRNHrI3bHlumeYRCu+QWgRpt2sW3GW0DfPj+x52YJJK3uFhUBajcPHUcUHxiqLnJYkKxIYzcBxY/C0MDerEw8pzBKLrjxY/jyQ6ehEpPDz1DWZY7x+aDAdd"></iframe>
<p></div></p>
</div>
</center>


+ 1
- 1
M/doc/ru/collisions.md View File

@@ -10,7 +10,7 @@ Lang: ru

Пример № 1. Отображение факта столкновения кирпича с землёй с помощью встроенной библиотеки [UIkit][uikit].

<iframe style="width: 100%; height: 52em" src="../../MYPOM/4.1/редактор.html?z64=eJyVlEFr2zAUx+/+FJpOMaRWyraLQ07tpYfSwthhlB1c13HUrHaQZXoYgSQMBuugx8Fgg7Iv0JaahLRLv8LTN9qTnaaS08IqsCzLj/f+/5/9BHcwUyNPjeASprCAK71SE/W98dkhOOAaZnCjznxSPZd7CzWGvxh8DZfmvh6HQdiPRZonRz6hufjU6Ek5yHzGYi69dBAlcXASZTI/4qmXipj1U5FEQrDdD/t7uxvbe1tMBKfsUARJ2GMnQSYjwUSUMbOmdzyIXdpc1R1Wy+VNfUHFU7zmtjo1VhNtbf2NHjx7JwPJQ59IkUfP5S4BfYMC5ojIZjLF3Tu4Vef1zHCvRj45aDXJmxZOr/W02frYtINKzIjM9EntGNsYtf2s4yjTzvXXhXucvz6ja7PSo+W91RJfKKzGXmtawC3WrUILvM9sJqYm+IW/3Y+KHBR1hZirwH00e0Bt8huPuGmTrL00KtCaHzShg89KboX2ZQY/5Wvoth3H6eZJKHmaEPhT2rrBNLp1sFPgN/w0LBUN16l8yB7PvIeegiskOKl6Cy5MEaRDHrI3bHlumeYRCu+SWgTpdGoW3FW0DfP9Th87MEkl7/IwKItRuHjqc0HxiqLnFYkKRNsZOg4sTwtDgzr3sPICgej64+XhkUSn/0XKbf8DaaUD7w=="></iframe>
<iframe style="width: 100%; height: 52em" src="../../MYPOM/5.0/редактор.html?z64=eJyVlEFr2zAUx+/+FJpOMaRWyraLS07dZYfSwthhlB1c13HUrHaQZXoYgSQbDNZBj4NCC2VfoC01CWmXfoWnb7QnO00lp4VOYNmWHu/9/z/5Ge5gqoaeGsIlTGAOV/pJjdWvxleH4IBrmMKNOvZJ9V6uzdUI/mLwNVya63rsBWEvFmme7PuE5uJLoytlP/MZi7n00n6UxMFhlMl8n6deKmLWS0USCcG2Pu1sb629295kIjhieyJIwi47DDIZCSaijJk1vYN+7NLmsu6gelzc1HdUPMFrZqtTIzXW1lZ39ODZBxlIHvpEijx6LncJ6CcUMENENpMJrt7BrTqpZ4Z7NfTJbqtJ3rRweq2n9dbnph1UYkZkpk9qx9jGqO1nFUeZdqZPF+5x/vGMrvVKj5b3Vkv8T2E19lrTHG6xbhVa4H1qMzE1wRl+dr8rclDUFWKuAtfR7C61ya894qZNsrJpVKA1P2hCBx+X3Artywx+ytfA3XAcp5MnoeRpQuBPaesG0+jWwU6Bczg1LBUN16l8yC7PvIeegiskOK56Cy5MEaRNHrI3bHlumeYRCu+QWgRpt2sW3GW0DfPj+x52YJJK3uFhUBajcPHUcUHxiqLnJYkKxIYzcBxY/C0MDerEw8pzBKLrjxY/jyQ6ehEpPDz1DWZY7x+aDAdd"></iframe>

</div>



+ 4
- 4
M/doc/ru/images.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -99,10 +99,10 @@
<p>Изображение представляет из себя отдельный <code>&lt;div&gt;</code>, который можно исследовать в отладке браузера.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Отображение статичного изображения под углом.</p>
<iframe style="width: 100%; height: 20em" src="../../4.0/редактор.html?z64=eJxtUM1Kw0AQvvsUS08thEwFe1kfRTxs27D9Mdkw2eBBCrEeFXyVWFsNttZXmHkjJ0ZKIg67zOx8s3zfN3SgiouQCyrpnY70Ule85qf+3ZmSoA1VtOVHrZr3T+/I9/Qpwxsq2/06xmaytOjyZKpVL8eb/sz7NNMAdu5Dl0aJNXGU+Xw6d6FDC0uHSYQI8SIDNLcwRpNMZhCbzEcIXICQrWkv6rb0QSW0ucNFage94MS/asrfJLpPhuiNdvKr4ueOjy/BKjrQjou/PmpMq6vz4TBQckZypb4OOkP8QK9CsdfqYtRFmrXJCtp6/5W6Glx+Azw7new="></iframe>
<iframe style="width: 100%; height: 20em" src="../../MYPOM/5.0/редактор.html?z64=eJxtUM1Kw0AQvvsUS08thEwFe1kfRTxs27D9Mdkw2eBBCrEeFXyVWFsNttZXmHkjJ0ZKIg67zOx8s3zfN3SgiouQCyrpnY70Ule85qf+3ZmSoA1VtOVHrZr3T+/I9/Qpwxsq2/06xmaytOjyZKpVL8eb/sz7NNMAdu5Dl0aJNXGU+Xw6d6FDC0uHSYQI8SIDNLcwRpNMZhCbzEcIXICQrWkv6rb0QSW0ucNFage94MS/asrfJLpPhuiNdvKr4ueOjy/BKjrQjou/PmpMq6vz4TBQckZypb4OOkP8QK9CsdfqYtRFmrXJCtp6/5W6Glx+Azw7new="></iframe>
<p></div><div class="contents"></p>
<p>Пример № 2. Отображение статичной платформы и падающего на неё самовара.</p>
<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<p></div></p>
</div>
</center>


+ 2
- 2
M/doc/ru/images.md View File

@@ -14,13 +14,13 @@ Lang: ru

Пример № 1. Отображение статичного изображения под углом.

<iframe style="width: 100%; height: 20em" src="../../4.0/редактор.html?z64=eJxtUM1Kw0AQvvsUS08thEwFe1kfRTxs27D9Mdkw2eBBCrEeFXyVWFsNttZXmHkjJ0ZKIg67zOx8s3zfN3SgiouQCyrpnY70Ule85qf+3ZmSoA1VtOVHrZr3T+/I9/Qpwxsq2/06xmaytOjyZKpVL8eb/sz7NNMAdu5Dl0aJNXGU+Xw6d6FDC0uHSYQI8SIDNLcwRpNMZhCbzEcIXICQrWkv6rb0QSW0ucNFage94MS/asrfJLpPhuiNdvKr4ueOjy/BKjrQjou/PmpMq6vz4TBQckZypb4OOkP8QK9CsdfqYtRFmrXJCtp6/5W6Glx+Azw7new="></iframe>
<iframe style="width: 100%; height: 20em" src="../../MYPOM/5.0/редактор.html?z64=eJxtUM1Kw0AQvvsUS08thEwFe1kfRTxs27D9Mdkw2eBBCrEeFXyVWFsNttZXmHkjJ0ZKIg67zOx8s3zfN3SgiouQCyrpnY70Ule85qf+3ZmSoA1VtOVHrZr3T+/I9/Qpwxsq2/06xmaytOjyZKpVL8eb/sz7NNMAdu5Dl0aJNXGU+Xw6d6FDC0uHSYQI8SIDNLcwRpNMZhCbzEcIXICQrWkv6rb0QSW0ucNFage94MS/asrfJLpPhuiNdvKr4ueOjy/BKjrQjou/PmpMq6vz4TBQckZypb4OOkP8QK9CsdfqYtRFmrXJCtp6/5W6Glx+Azw7new="></iframe>

</div><div class="contents">

Пример № 2. Отображение статичной платформы и падающего на неё самовара.

<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>

</div>


+ 2
- 2
M/doc/ru/item.template View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>


+ 3
- 2
M/doc/ru/keys.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -103,6 +103,7 @@
<li><a href="images.html">изображения</a></li>
<li><a href="objects.html">объекты</a></li>
<li><a href="tracking.html">слежение</a></li>
<li><a href="states.html">состояния</a></li>
<li><a href="collisions.html">столкновения</a></li>
<li><a href="bodies.html">тела</a></li>
<li><a href="physics.html">физика</a></li>


+ 2
- 0
M/doc/ru/keys.md View File

@@ -13,6 +13,7 @@ Lang: ru
1. [изображения][images]
1. [объекты][objects]
1. [слежение][tracking]
1. [состояния][states]
1. [столкновения][collisions]
1. [тела][bodies]
1. [физика][physics]
@@ -23,6 +24,7 @@ Lang: ru
[images]: images.html
[objects]: objects.html
[physics]: physics.html
[states]: states.html
[styles]: styles.html
[title]: title.html
[tracking]: tracking.html

+ 3
- 3
M/doc/ru/objects.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -97,7 +97,7 @@
<p>Добавление одного или нескольких объектов, которые представляют собой комбинацию <a href="images.html">изображения</a>, <a href="bodies.html">тела</a> и их синхронизацию через <a href="tracking.html">слежение</a>.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Отображение двух падающих на платформу пауков.</p>
<iframe style="width: 100%; height: 45em" src="../../4.0/редактор.html?z64=eJylUd1ugjAUvucpGrIlmiBFtyULZk+xy2WJFQmiSEkp2YUxwZ+ruYdxRqdhU1/h9I1WUDeJwYvtBNpyevi+75zPszkSMSzFUIxFLNcpekBqm/MgNDF2XK7TwPYd0rNDHrVcqlPm4C5lvs0Y7nVCzMgLbjLiW23cIyG3GRaxWlcU+IK1iHWJPYMVbOE9PYmReCv1FSQD5rCGhZiaaP+d5bZiCBtZPIfZaT6NJrG6DqOR3zJRI2Je6aqf1z3A8vcRfEq+BSQww6doeidwyg3tB3Hwe4Sd1DWG5C+EH7KHeUa7EVNY4iOWHvhOGfm0wuzAJhyFFqOeh4zr9MHIoj4nrn+u57CJicRdyTfJz0GyjtIhnt+k4YaPnHDXMhFnkV2EnVnxCktIpBn56e/S4cnsRHYUS//OGGAnYhM9VQ0N3RrHpWo8a/mqzFkTqacGqPmafIdqvjH1ok/VAlW1vZhMloZuilUdcC6z1Ip6v7/TUOVfNHIblOvKN4ErWYQ="></iframe>
<iframe style="width: 100%; height: 45em" src="../../MYPOM/5.0/редактор.html?z64=eJylUd1ugjAUvucpGrIlmiBFtyULZk+xy2WJFQmiSEkp2YUxwZ+ruYdxRqdhU1/h9I1WUDeJwYvtBNpyevi+75zPszkSMSzFUIxFLNcpekBqm/MgNDF2XK7TwPYd0rNDHrVcqlPm4C5lvs0Y7nVCzMgLbjLiW23cIyG3GRaxWlcU+IK1iHWJPYMVbOE9PYmReCv1FSQD5rCGhZiaaP+d5bZiCBtZPIfZaT6NJrG6DqOR3zJRI2Je6aqf1z3A8vcRfEq+BSQww6doeidwyg3tB3Hwe4Sd1DWG5C+EH7KHeUa7EVNY4iOWHvhOGfm0wuzAJhyFFqOeh4zr9MHIoj4nrn+u57CJicRdyTfJz0GyjtIhnt+k4YaPnHDXMhFnkV2EnVnxCktIpBn56e/S4cnsRHYUS//OGGAnYhM9VQ0N3RrHpWo8a/mqzFkTqacGqPmafIdqvjH1ok/VAlW1vZhMloZuilUdcC6z1Ip6v7/TUOVfNHIblOvKN4ErWYQ="></iframe>
<p></div></p>
</div>
</center>


+ 1
- 1
M/doc/ru/objects.md View File

@@ -10,7 +10,7 @@ Lang: ru

Пример № 1. Отображение двух падающих на платформу пауков.

<iframe style="width: 100%; height: 45em" src="../../4.0/редактор.html?z64=eJylUd1ugjAUvucpGrIlmiBFtyULZk+xy2WJFQmiSEkp2YUxwZ+ruYdxRqdhU1/h9I1WUDeJwYvtBNpyevi+75zPszkSMSzFUIxFLNcpekBqm/MgNDF2XK7TwPYd0rNDHrVcqlPm4C5lvs0Y7nVCzMgLbjLiW23cIyG3GRaxWlcU+IK1iHWJPYMVbOE9PYmReCv1FSQD5rCGhZiaaP+d5bZiCBtZPIfZaT6NJrG6DqOR3zJRI2Je6aqf1z3A8vcRfEq+BSQww6doeidwyg3tB3Hwe4Sd1DWG5C+EH7KHeUa7EVNY4iOWHvhOGfm0wuzAJhyFFqOeh4zr9MHIoj4nrn+u57CJicRdyTfJz0GyjtIhnt+k4YaPnHDXMhFnkV2EnVnxCktIpBn56e/S4cnsRHYUS//OGGAnYhM9VQ0N3RrHpWo8a/mqzFkTqacGqPmafIdqvjH1ok/VAlW1vZhMloZuilUdcC6z1Ip6v7/TUOVfNHIblOvKN4ErWYQ="></iframe>
<iframe style="width: 100%; height: 45em" src="../../MYPOM/5.0/редактор.html?z64=eJylUd1ugjAUvucpGrIlmiBFtyULZk+xy2WJFQmiSEkp2YUxwZ+ruYdxRqdhU1/h9I1WUDeJwYvtBNpyevi+75zPszkSMSzFUIxFLNcpekBqm/MgNDF2XK7TwPYd0rNDHrVcqlPm4C5lvs0Y7nVCzMgLbjLiW23cIyG3GRaxWlcU+IK1iHWJPYMVbOE9PYmReCv1FSQD5rCGhZiaaP+d5bZiCBtZPIfZaT6NJrG6DqOR3zJRI2Je6aqf1z3A8vcRfEq+BSQww6doeidwyg3tB3Hwe4Sd1DWG5C+EH7KHeUa7EVNY4iOWHvhOGfm0wuzAJhyFFqOeh4zr9MHIoj4nrn+u57CJicRdyTfJz0GyjtIhnt+k4YaPnHDXMhFnkV2EnVnxCktIpBn56e/S4cnsRHYUS//OGGAnYhM9VQ0N3RrHpWo8a/mqzFkTqacGqPmafIdqvjH1ok/VAlW1vZhMloZuilUdcC6z1Ip6v7/TUOVfNHIblOvKN4ErWYQ="></iframe>

</div>



+ 3
- 3
M/doc/ru/physics.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -97,7 +97,7 @@
<p>Задание одного или нескольких настроек физики Matter.js, которые будут применяться для конкретного <a href="bodies.html">тела</a> или <a href="objects.html">объекта</a>.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Маски столкновений.</p>
<iframe style="width: 100%; height: 60em" src="../../4.0/редактор.html?z64=eJydlNFK40AUhu/7FEPwogXN1Lp7sZG9XfDaG0EEY4zp2DQpkynLIoW0ioIVvPV6n6CWZg3Rtq9w5o32TNrVpklE90AnaSb9zzf/+alrCyJDiGRfXsoQ1yH5TrSmEJ3AoNRhQvc7tueYbTsQ3VPm6z53aMvnns05bZ8HlJs/6Qk3PatJ22YgbE5lqO1WKvACsQx11B7BE8zgUd3JgbyrXlQIFowhhokcGmTxPX02k32Y4stjGK0+V3ViWi2H+13v1CDHXe5WNy6y3D2KPx/AM/abQAIjuqqmn3ec2vHmq2Lv7RbmyHUJyf80/INnGKdtp3IIEf2npXe8TDtVAk0KznzeNogWWKZrH1R3aloOaXmRVyj9hJ8kawU2Higf8zuqWLAvTMEsA7t17eLjPkKEwg/oTITnuEahOCeD0xXMNMied8Y8Jn4VK70gSF9hwG/UfM7jWL7rsoD53g/mYjLWt1VhZloGaWSt6pW5knqyzBKaH+EhYnmfidBcgWDOrnAsoUJc7wpzGRrkcLu+SXa+4fKljkujfpRFWMQTR7WaovJpDfIGfIokhUiX7XWSbBK0bABKiVKXbpEqQYLhGldh3pc0jQVEioMOlfuylNHepS1KW545FU7U/wWqxvKmDO0rEm01PsBWPLMivlyGCx3t1Xb/AtFw/7E="></iframe>
<iframe style="width: 100%; height: 60em" src="../../MYPOM/5.0/редактор.html?z64=eJydlNFK40AUhu/7FEPwogXN1Lp7sZG9XfDaG0EEY4zp2DQpkynLIoW0ioIVvPV6n6CWZg3Rtq9w5o32TNrVpklE90AnaSb9zzf/+alrCyJDiGRfXsoQ1yH5TrSmEJ3AoNRhQvc7tueYbTsQ3VPm6z53aMvnns05bZ8HlJs/6Qk3PatJ22YgbE5lqO1WKvACsQx11B7BE8zgUd3JgbyrXlQIFowhhokcGmTxPX02k32Y4stjGK0+V3ViWi2H+13v1CDHXe5WNy6y3D2KPx/AM/abQAIjuqqmn3ec2vHmq2Lv7RbmyHUJyf80/INnGKdtp3IIEf2npXe8TDtVAk0KznzeNogWWKZrH1R3aloOaXmRVyj9hJ8kawU2Higf8zuqWLAvTMEsA7t17eLjPkKEwg/oTITnuEahOCeD0xXMNMied8Y8Jn4VK70gSF9hwG/UfM7jWL7rsoD53g/mYjLWt1VhZloGaWSt6pW5knqyzBKaH+EhYnmfidBcgWDOrnAsoUJc7wpzGRrkcLu+SXa+4fKljkujfpRFWMQTR7WaovJpDfIGfIokhUiX7XWSbBK0bABKiVKXbpEqQYLhGldh3pc0jQVEioMOlfuylNHepS1KW545FU7U/wWqxvKmDO0rEm01PsBWPLMivlyGCx3t1Xb/AtFw/7E="></iframe>
<p></div></p>
</div>
</center>


+ 1
- 1
M/doc/ru/physics.md View File

@@ -10,7 +10,7 @@ Lang: ru

Пример № 1. Маски столкновений.

<iframe style="width: 100%; height: 60em" src="../../4.0/редактор.html?z64=eJydlNFK40AUhu/7FEPwogXN1Lp7sZG9XfDaG0EEY4zp2DQpkynLIoW0ioIVvPV6n6CWZg3Rtq9w5o32TNrVpklE90AnaSb9zzf/+alrCyJDiGRfXsoQ1yH5TrSmEJ3AoNRhQvc7tueYbTsQ3VPm6z53aMvnns05bZ8HlJs/6Qk3PatJ22YgbE5lqO1WKvACsQx11B7BE8zgUd3JgbyrXlQIFowhhokcGmTxPX02k32Y4stjGK0+V3ViWi2H+13v1CDHXe5WNy6y3D2KPx/AM/abQAIjuqqmn3ec2vHmq2Lv7RbmyHUJyf80/INnGKdtp3IIEf2npXe8TDtVAk0KznzeNogWWKZrH1R3aloOaXmRVyj9hJ8kawU2Higf8zuqWLAvTMEsA7t17eLjPkKEwg/oTITnuEahOCeD0xXMNMied8Y8Jn4VK70gSF9hwG/UfM7jWL7rsoD53g/mYjLWt1VhZloGaWSt6pW5knqyzBKaH+EhYnmfidBcgWDOrnAsoUJc7wpzGRrkcLu+SXa+4fKljkujfpRFWMQTR7WaovJpDfIGfIokhUiX7XWSbBK0bABKiVKXbpEqQYLhGldh3pc0jQVEioMOlfuylNHepS1KW545FU7U/wWqxvKmDO0rEm01PsBWPLMivlyGCx3t1Xb/AtFw/7E="></iframe>
<iframe style="width: 100%; height: 60em" src="../../MYPOM/5.0/редактор.html?z64=eJydlNFK40AUhu/7FEPwogXN1Lp7sZG9XfDaG0EEY4zp2DQpkynLIoW0ioIVvPV6n6CWZg3Rtq9w5o32TNrVpklE90AnaSb9zzf/+alrCyJDiGRfXsoQ1yH5TrSmEJ3AoNRhQvc7tueYbTsQ3VPm6z53aMvnns05bZ8HlJs/6Qk3PatJ22YgbE5lqO1WKvACsQx11B7BE8zgUd3JgbyrXlQIFowhhokcGmTxPX02k32Y4stjGK0+V3ViWi2H+13v1CDHXe5WNy6y3D2KPx/AM/abQAIjuqqmn3ec2vHmq2Lv7RbmyHUJyf80/INnGKdtp3IIEf2npXe8TDtVAk0KznzeNogWWKZrH1R3aloOaXmRVyj9hJ8kawU2Higf8zuqWLAvTMEsA7t17eLjPkKEwg/oTITnuEahOCeD0xXMNMied8Y8Jn4VK70gSF9hwG/UfM7jWL7rsoD53g/mYjLWt1VhZloGaWSt6pW5knqyzBKaH+EhYnmfidBcgWDOrnAsoUJc7wpzGRrkcLu+SXa+4fKljkujfpRFWMQTR7WaovJpDfIGfIokhUiX7XWSbBK0bABKiVKXbpEqQYLhGldh3pc0jQVEioMOlfuylNHepS1KW545FU7U/wWqxvKmDO0rEm01PsBWPLMivlyGCx3t1Xb/AtFw/7E="></iframe>

</div>



+ 111
- 0
M/doc/ru/states.html View File

@@ -0,0 +1,111 @@
<!DOCTYPE html>
<html>
<meta charset="utf-8">
<head>
<style>
#header
{
background: #bababf;
padding: 0.7em;
text-align: left;
}
#header a
{
color: white;
text-decoration: none;
padding: 0.5em 1em 0.5em 1em;
}
#title
{
color: #433729;
}
html
{
font-family: sans-serif;
}
body
{
line-height: 1.5em;
}
body
{
background: #FAFAFA;
}
table
{
border-collapse: collapse;
width: 100%;
}
table, th, td
{
border: 1px solid #aaa;
padding: 0.5em;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
code, pre
{
font-family: monospace, serif;
font-size: 1em;
color: #7f0a0c;
background: #f5f5f5;
white-space: pre-wrap;
}
video
{
width: 100%;
}
.contents
{
background: #FFFFFF;
width: 720px;
padding: 1em;
margin-top: 2em;
margin-bottom: 2em;
border: 1px solid #E0E0E0;
text-align: left;
color: #444;
}
#footer
{
text-align: center;
}
#lang
{
float: right;
}
</style>
<title>
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
<center>
<h1>
состояния
</h1>
</center>
<center>
<div class="contents">
<p>Задание и применение различных состояний.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Возвращение кирпича в начальное положение после столкновения с землёй.</p>
<iframe style="width: 100%; height: 66em" src="../../MYPOM/5.0/редактор.html?z64=eJylVE1r20AQvetXLHuywNE6aQtFwaf2GlLoqYQeFEeRlQ/JrFbkUAy2Wwg0BUMvhUAP/QVNTISN4jh/YfYfdVaSbWldtQ1dsLS7ep55780wMIeZHFhyADcwhQXcqp0cyS+NDwbBBROYwZ28skl+zu4WcggPCJ7ATflerUOnc+rxMA6ObEJjftboCtGLbMY8X1hhzw0859yNRHzkh1bIPXYa8sDlnO29e7O/t/V6/xXjzgU75E7Q6bJzJxIuZ9yNWDmnddLzTNpc5e3n2+IlPyHjKf7SKjs5lCMlbfOLWn70VjjC79hE8Niti50Z9BkSSNGiqidTvJ3DvRzrkeFRDmxy0GqS5y18PFOP7db7ZhWU2YyWlXXSKqYqjFb1bNqRhU1VdeERn5c1vLZzPoreC0XxicRqku3UZHuJOXb+N9my0EMFQwMWcozgWdX6Mhv4Ct/Rqkvs8XtYbFCrLeq/2Pg0OzXLtKOuT2lDxmlhRfIXlagRvuVtCInOE2MleI+dc0CrirfWvUubZONjKQPV1KgKIPgqa8JE1a0M/p2uvrlrGMZxHHSEHwYEC5Mg/kF+VCMHrtf/bphGzl90/chaDia4xWKP8gEFP8rJSZssozaqtMwszNoM/5hoCNJua9TNFVprlWJaap0HPy1VftzMiyKpAUrrW5CiDStzcm92jb5hlOIv6ckxxsbjXRZnWAznwL34o3mqjhNIMc8vueKE1A=="></iframe>
<p></div></p>
</div>
</center>
<div id="footer">
Документация сгенерирована <a href="http://opengamestudio.org/pskov">ПСКОВОМ</a>
из <a href="https://git.opengamestudio.org/kornerr/MYPOM/src/branch/master/doc">
этого исходного кода</a>.
</div>
</body>
</html>


+ 15
- 0
M/doc/ru/states.md View File

@@ -0,0 +1,15 @@
Title: состояния
Date: 2022-01-17 00:00
Category: Страница
Slug: states
Lang: ru

Задание и применение различных состояний.

</div><div class="contents">

Пример № 1. Возвращение кирпича в начальное положение после столкновения с землёй.

<iframe style="width: 100%; height: 66em" src="../../MYPOM/5.0/редактор.html?z64=eJylVE1r20AQvetXLHuywNE6aQtFwaf2GlLoqYQeFEeRlQ/JrFbkUAy2Wwg0BUMvhUAP/QVNTISN4jh/YfYfdVaSbWldtQ1dsLS7ep55780wMIeZHFhyADcwhQXcqp0cyS+NDwbBBROYwZ28skl+zu4WcggPCJ7ATflerUOnc+rxMA6ObEJjftboCtGLbMY8X1hhzw0859yNRHzkh1bIPXYa8sDlnO29e7O/t/V6/xXjzgU75E7Q6bJzJxIuZ9yNWDmnddLzTNpc5e3n2+IlPyHjKf7SKjs5lCMlbfOLWn70VjjC79hE8Niti50Z9BkSSNGiqidTvJ3DvRzrkeFRDmxy0GqS5y18PFOP7db7ZhWU2YyWlXXSKqYqjFb1bNqRhU1VdeERn5c1vLZzPoreC0XxicRqku3UZHuJOXb+N9my0EMFQwMWcozgWdX6Mhv4Ct/Rqkvs8XtYbFCrLeq/2Pg0OzXLtKOuT2lDxmlhRfIXlagRvuVtCInOE2MleI+dc0CrirfWvUubZONjKQPV1KgKIPgqa8JE1a0M/p2uvrlrGMZxHHSEHwYEC5Mg/kF+VCMHrtf/bphGzl90/chaDia4xWKP8gEFP8rJSZssozaqtMwszNoM/5hoCNJua9TNFVprlWJaap0HPy1VftzMiyKpAUrrW5CiDStzcm92jb5hlOIv6ckxxsbjXRZnWAznwL34o3mqjhNIMc8vueKE1A=="></iframe>

</div>

+ 3
- 3
M/doc/ru/styles.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -97,7 +97,7 @@
<p>Задание одного или нескольких стилей CSS, которые будут применяться для конкретного <a href="images.html">изображения</a> или <a href="objects.html">объекта</a>.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Задание стилей для изображения и объекта.</p>
<iframe style="width: 100%; height: 48em" src="../../4.0/редактор.html?z64=eJydU8tugkAU3fMVE9KFJpbx0S6K6Vd006RpIiLFJ5hhSBfGBB9Jk9qkv2KNVoJVf+HOH/WCthUp6eMmXAYYzjn3HGgbnAgPFmIgRsLDPiGXRK5z3nVUSs0GV+yuYZlax3C4W2vYis1M2rKZZTBGO02HMu2eVplm6XXa0RxuMCo8uSxJ8Aa+8BTEnsISNvASrsRQPGV6EsGCGfgwFxOV7K6jexsxgDVunsH08H5YVU1vmcx2rZpKKi5rZ056cd19iq8PYYV8cwhgSg/RlGbXzFZyn4j9ryVsUdcIgv8QvuIMs4h2LSawoB9YSteK0YXF0STnzmYdlciOrrWN60wpKyck7U9ijNBLPIK4FUg8DH1MPgmr4VxxjTd0FdlcIw07Qt4ngiMs0CRfPMeC2IY+YlpjHM7DKBNMsBWeSm4K+RwpXWA7y2Mr5m/jM+9CxoEPs0ifeYhaVnGuPymJREStcKwk7qcctzFVUeTSI6oKUMHkSNe3X81eTXEnIpKDDqX7sodJKoi2BeE/hHt88ZBGdI74p8VfMP2UQD9blt4BwuOSOQ=="></iframe>
<iframe style="width: 100%; height: 48em" src="../../MYPOM/5.0/редактор.html?z64=eJydU8tugkAU3fMVE9KFJpbx0S6K6Vd006RpIiLFJ5hhSBfGBB9Jk9qkv2KNVoJVf+HOH/WCthUp6eMmXAYYzjn3HGgbnAgPFmIgRsLDPiGXRK5z3nVUSs0GV+yuYZlax3C4W2vYis1M2rKZZTBGO02HMu2eVplm6XXa0RxuMCo8uSxJ8Aa+8BTEnsISNvASrsRQPGV6EsGCGfgwFxOV7K6jexsxgDVunsH08H5YVU1vmcx2rZpKKi5rZ056cd19iq8PYYV8cwhgSg/RlGbXzFZyn4j9ryVsUdcIgv8QvuIMs4h2LSawoB9YSteK0YXF0STnzmYdlciOrrWN60wpKyck7U9ijNBLPIK4FUg8DH1MPgmr4VxxjTd0FdlcIw07Qt4ngiMs0CRfPMeC2IY+YlpjHM7DKBNMsBWeSm4K+RwpXWA7y2Mr5m/jM+9CxoEPs0ifeYhaVnGuPymJREStcKwk7qcctzFVUeTSI6oKUMHkSNe3X81eTXEnIpKDDqX7sodJKoi2BeE/hHt88ZBGdI74p8VfMP2UQD9blt4BwuOSOQ=="></iframe>
<p></div></p>
</div>
</center>


+ 1
- 1
M/doc/ru/styles.md View File

@@ -10,7 +10,7 @@ Lang: ru

Пример № 1. Задание стилей для изображения и объекта.

<iframe style="width: 100%; height: 48em" src="../../4.0/редактор.html?z64=eJydU8tugkAU3fMVE9KFJpbx0S6K6Vd006RpIiLFJ5hhSBfGBB9Jk9qkv2KNVoJVf+HOH/WCthUp6eMmXAYYzjn3HGgbnAgPFmIgRsLDPiGXRK5z3nVUSs0GV+yuYZlax3C4W2vYis1M2rKZZTBGO02HMu2eVplm6XXa0RxuMCo8uSxJ8Aa+8BTEnsISNvASrsRQPGV6EsGCGfgwFxOV7K6jexsxgDVunsH08H5YVU1vmcx2rZpKKi5rZ056cd19iq8PYYV8cwhgSg/RlGbXzFZyn4j9ryVsUdcIgv8QvuIMs4h2LSawoB9YSteK0YXF0STnzmYdlciOrrWN60wpKyck7U9ijNBLPIK4FUg8DH1MPgmr4VxxjTd0FdlcIw07Qt4ngiMs0CRfPMeC2IY+YlpjHM7DKBNMsBWeSm4K+RwpXWA7y2Mr5m/jM+9CxoEPs0ifeYhaVnGuPymJREStcKwk7qcctzFVUeTSI6oKUMHkSNe3X81eTXEnIpKDDqX7sodJKoi2BeE/hHt88ZBGdI74p8VfMP2UQD9blt4BwuOSOQ=="></iframe>
<iframe style="width: 100%; height: 48em" src="../../MYPOM/5.0/редактор.html?z64=eJydU8tugkAU3fMVE9KFJpbx0S6K6Vd006RpIiLFJ5hhSBfGBB9Jk9qkv2KNVoJVf+HOH/WCthUp6eMmXAYYzjn3HGgbnAgPFmIgRsLDPiGXRK5z3nVUSs0GV+yuYZlax3C4W2vYis1M2rKZZTBGO02HMu2eVplm6XXa0RxuMCo8uSxJ8Aa+8BTEnsISNvASrsRQPGV6EsGCGfgwFxOV7K6jexsxgDVunsH08H5YVU1vmcx2rZpKKi5rZ056cd19iq8PYYV8cwhgSg/RlGbXzFZyn4j9ryVsUdcIgv8QvuIMs4h2LSawoB9YSteK0YXF0STnzmYdlciOrrWN60wpKyck7U9ijNBLPIK4FUg8DH1MPgmr4VxxjTd0FdlcIw07Qt4ngiMs0CRfPMeC2IY+YlpjHM7DKBNMsBWeSm4K+RwpXWA7y2Mr5m/jM+9CxoEPs0ifeYhaVnGuPymJREStcKwk7qcctzFVUeTSI6oKUMHkSNe3X81eTXEnIpKDDqX7sodJKoi2BeE/hHt88ZBGdI74p8VfMP2UQD9blt4BwuOSOQ=="></iframe>

</div>



+ 4
- 3
M/doc/ru/title.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -101,8 +101,9 @@
заголовок: "Колобок",
});
</code></pre>
<p><a href="../../3.4/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM=">Посмотреть результат</a>.</p>
<p><a href="../../MYPOM/5.0/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM=" target="_blank">Посмотреть результат</a></p>
<p></div></p>
<p>[result]: </p>
</div>
</center>
<div id="footer">


+ 2
- 2
M/doc/ru/title.md View File

@@ -16,8 +16,8 @@ Lang: ru
});
```

[Посмотреть результат][result].
<a href="../../MYPOM/5.0/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM=" target="_blank">Посмотреть результат</a>

</div>

[result]: ../../3.4/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM=
[result]:

+ 4
- 4
M/doc/ru/tracking.html View File

@@ -78,12 +78,12 @@
}
</style>
<title>
Документация МУРОМа 4.1
Документация МУРОМа 5.0
</title>
</head>
<body>
<div id="header">
<strong id="title">Документация МУРОМа 4.1</strong>
<strong id="title">Документация МУРОМа 5.0</strong>
<a href="http://opengamestudio.org/M">МУРОМ</a>
<a href="keys.html">Ключи (API)</a>
</div>
@@ -98,10 +98,10 @@
<p><strong>ВНИМАНИЕ</strong>: на текущий момент некорректно работает с составными телами: не учитывается вращение частей.</p>
<p></div><div class="contents"></p>
<p>Пример № 1. Мгновенное следование изображения за телом.</p>
<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<p></div><div class="contents"></p>
<p>Пример № 2. Замедленное следование изображения за телом со смещением и пределом для ограничения мельтешения.</p>
<iframe style="width: 100%; height: 60em" src="../../4.0/редактор.html?z64=eJydU81Kw0AQvvcplqBgIc2m+HOI+BQeRTDGEGPbJGy2eJBCUvUgCl69iW9QS6vFanyF2TdyNv0xa1JBl+wmmU6/b+abL22XE5HAWKTiUiR43pI9op1yHsUWpZ7PjTByA8/uuDHvnvihETKPtkIWuIzRzllMmX1Oj5kdOKe0Y8fcZVQk2m6tBu8wEYmB2AN4hQye5ZPoi7uNixrBBUOYwEjcWmT2nscykcIHJg9hUIzLdWw7LY+F3eDEIkdd1t5Yu1Dr7lH8ex+myDeCNxjQIppxFnn1I32J2Pt+xKQBFpunieQ/tEN8v4EJVZGMKPDqJAgbzI1cm5PYYWG7Tcx1eVHihAG3/aBc0/wmrlCfV9xvqhbI2ZdCln+Ry4/3uc19xyKcdd1V2DnyfCTwAmNUaSLulUnMMp6KDZXZ4FMKdtA0TZ1s497EvWMe6mpSPmiLaKo8WuUw5ryPcoxoliucYQLvqksUZkmMx5Y8miupi1YoEy8U76MS0wq1M4w+S73/3H+xs0+1p1/U/LUn1ReaaofVvaXIPl7MGsZqjxj5ENe5Gx6qnIHRp6IOFbVXOEqyaNVG0n70NFM+W/SzJPqZlyKI/NaW+AeN5rZOGpsllVKsUuqcSUBxZxHTMJt6SW9EGkluS86vQrteffcLwysl+g=="></iframe>
<iframe style="width: 100%; height: 60em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81Kw0AQvvcplqBgIc2m+HOI+BQeRTDGEGPbJGy2eJBCUvUgCl69iW9QS6vFanyF2TdyNv0xa1JBl+wmmU6/b+abL22XE5HAWKTiUiR43pI9op1yHsUWpZ7PjTByA8/uuDHvnvihETKPtkIWuIzRzllMmX1Oj5kdOKe0Y8fcZVQk2m6tBu8wEYmB2AN4hQye5ZPoi7uNixrBBUOYwEjcWmT2nscykcIHJg9hUIzLdWw7LY+F3eDEIkdd1t5Yu1Dr7lH8ex+myDeCNxjQIppxFnn1I32J2Pt+xKQBFpunieQ/tEN8v4EJVZGMKPDqJAgbzI1cm5PYYWG7Tcx1eVHihAG3/aBc0/wmrlCfV9xvqhbI2ZdCln+Ry4/3uc19xyKcdd1V2DnyfCTwAmNUaSLulUnMMp6KDZXZ4FMKdtA0TZ1s497EvWMe6mpSPmiLaKo8WuUw5ryPcoxoliucYQLvqksUZkmMx5Y8miupi1YoEy8U76MS0wq1M4w+S73/3H+xs0+1p1/U/LUn1ReaaofVvaXIPl7MGsZqjxj5ENe5Gx6qnIHRp6IOFbVXOEqyaNVG0n70NFM+W/SzJPqZlyKI/NaW+AeN5rZOGpsllVKsUuqcSUBxZxHTMJt6SW9EGkluS86vQrteffcLwysl+g=="></iframe>
<p></div></p>
</div>
</center>


+ 2
- 2
M/doc/ru/tracking.md View File

@@ -12,13 +12,13 @@ Lang: ru

Пример № 1. Мгновенное следование изображения за телом.

<iframe style="width: 100%; height: 55em" src="../../4.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>
<iframe style="width: 100%; height: 55em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81OwkAQvvMUm0YTSaALQTyU+BQejYmlNqUIbbNd4sGQFNSDwcSrN+MbAAEhoPgKs2/kbPmxC8VEN93ddjqdb79vvjZsTkQEY9ERdyLCtUdOiVbjPAgNSh2X635ge47ZtEPeunJ93WcOvfaZZzNGm/WQMvOGVpnpWTXaNENuMyoirZLJwAdMRaRj7T5MYAEDeSe64unoNkNwwBCmMBI9gyyf49hCdOATk4fQT8blqJrWtcP8lndlkMsWaxwd3KrnblP8vAtzxBvBDPo0WU2vB072Mrep2P65xaQ+HjZOE9F/YIf4/AhTqlbSA8/JEs/PMzuwTU5Ci/mNBikcyosSy/e46Xq7Z1pt4h71meCcqVogZlcKuftGDjc84yZ3LYNw1rL31Y4rr1oC7zBGlabiWenEMuMtSWgXDb6kYOfFQiFHyjhLOE8KFzk1KW60QTRVHi21GSvcV9lGNMs99jCCD9UlCrIExuVYLsW90Ekr7AKvFe+iEvMUtRcYHUi9/8w/yexL5fSLmr9yUn2hqXbYz62D6ON1r2GscsTIp3iI3fCS5gyMviV1SDl7iqMkipZuJG2L01L5xZrPBmg7r4NF5L+2qX+eL5ZzJF9KER23drbyDT5TDHI="></iframe>

</div><div class="contents">

Пример № 2. Замедленное следование изображения за телом со смещением и пределом для ограничения мельтешения.

<iframe style="width: 100%; height: 60em" src="../../4.0/редактор.html?z64=eJydU81Kw0AQvvcplqBgIc2m+HOI+BQeRTDGEGPbJGy2eJBCUvUgCl69iW9QS6vFanyF2TdyNv0xa1JBl+wmmU6/b+abL22XE5HAWKTiUiR43pI9op1yHsUWpZ7PjTByA8/uuDHvnvihETKPtkIWuIzRzllMmX1Oj5kdOKe0Y8fcZVQk2m6tBu8wEYmB2AN4hQye5ZPoi7uNixrBBUOYwEjcWmT2nscykcIHJg9hUIzLdWw7LY+F3eDEIkdd1t5Yu1Dr7lH8ex+myDeCNxjQIppxFnn1I32J2Pt+xKQBFpunieQ/tEN8v4EJVZGMKPDqJAgbzI1cm5PYYWG7Tcx1eVHihAG3/aBc0/wmrlCfV9xvqhbI2ZdCln+Ry4/3uc19xyKcdd1V2DnyfCTwAmNUaSLulUnMMp6KDZXZ4FMKdtA0TZ1s497EvWMe6mpSPmiLaKo8WuUw5ryPcoxoliucYQLvqksUZkmMx5Y8miupi1YoEy8U76MS0wq1M4w+S73/3H+xs0+1p1/U/LUn1ReaaofVvaXIPl7MGsZqjxj5ENe5Gx6qnIHRp6IOFbVXOEqyaNVG0n70NFM+W/SzJPqZlyKI/NaW+AeN5rZOGpsllVKsUuqcSUBxZxHTMJt6SW9EGkluS86vQrteffcLwysl+g=="></iframe>
<iframe style="width: 100%; height: 60em" src="../../MYPOM/5.0/редактор.html?z64=eJydU81Kw0AQvvcplqBgIc2m+HOI+BQeRTDGEGPbJGy2eJBCUvUgCl69iW9QS6vFanyF2TdyNv0xa1JBl+wmmU6/b+abL22XE5HAWKTiUiR43pI9op1yHsUWpZ7PjTByA8/uuDHvnvihETKPtkIWuIzRzllMmX1Oj5kdOKe0Y8fcZVQk2m6tBu8wEYmB2AN4hQye5ZPoi7uNixrBBUOYwEjcWmT2nscykcIHJg9hUIzLdWw7LY+F3eDEIkdd1t5Yu1Dr7lH8ex+myDeCNxjQIppxFnn1I32J2Pt+xKQBFpunieQ/tEN8v4EJVZGMKPDqJAgbzI1cm5PYYWG7Tcx1eVHihAG3/aBc0/wmrlCfV9xvqhbI2ZdCln+Ry4/3uc19xyKcdd1V2DnyfCTwAmNUaSLulUnMMp6KDZXZ4FMKdtA0TZ1s497EvWMe6mpSPmiLaKo8WuUw5ryPcoxoliucYQLvqksUZkmMx5Y8miupi1YoEy8U76MS0wq1M4w+S73/3H+xs0+1p1/U/LUn1ReaaofVvaXIPl7MGsZqjxj5ENe5Gx6qnIHRp6IOFbVXOEqyaNVG0n70NFM+W/SzJPqZlyKI/NaW+AeN5rZOGpsllVKsUuqcSUBxZxHTMJt6SW9EGkluS86vQrteffcLwysl+g=="></iframe>

</div>


+ 1
- 1
M/index.html View File

@@ -1,4 +1,4 @@
<!DOCTYPE html>
<html>
<meta http-equiv="refresh" content="0; URL='4.1/редактор.html'"/>
<meta http-equiv="refresh" content="0; URL='5.0/редактор.html'"/>
</html>

Loading…
Cancel
Save