From 4c644ca9aeedc1695311dd0d38befd83c12447ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB=20=D0=9A=D0=B0=D0=BF?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BA=D0=BE?= Date: Mon, 27 Sep 2021 15:18:40 +0300 Subject: [PATCH] M-3.4 --- M/3.4/игра.html | 36 +++++ M/3.4/игра/050.Заголовок.js | 10 ++ M/3.4/игра/100.Изображения.js | 104 ++++++++++++++ M/3.4/игра/120.Физика.js | 19 +++ M/3.4/игра/140.Тела.js | 123 +++++++++++++++++ M/3.4/игра/160.Слежение.js | 97 +++++++++++++ M/3.4/игра/700.Игра.js | 65 +++++++++ M/3.4/игра/matter-js | 1 + M/3.4/общее/100.События.js | 31 +++++ M/3.4/общее/150.Состояние.js | 61 +++++++++ M/3.4/общее/200.функции.js | 91 +++++++++++++ M/3.4/общее/base64-js | 1 + M/3.4/общее/pako | 1 + M/3.4/редактор.html | 102 ++++++++++++++ .../редактор/100.Редактор.js | 127 ++++++++++++++++++ M/3.4/редактор/200.Пульт.js | 53 ++++++++ M/3.4/редактор/700.Муром.js | 13 ++ M/3.4/редактор/ace | 1 + M/3.4/редактор/uikit | 1 + M/doc/pskov.cfg | 11 ++ M/doc/ru/bodies.html | 115 ++++++++++++++++ M/doc/ru/bodies.md | 24 ++++ M/doc/ru/images.html | 116 ++++++++++++++++ M/doc/ru/images.md | 26 ++++ M/doc/ru/index.html | 4 + M/doc/ru/item.template | 107 +++++++++++++++ M/doc/ru/keys.html | 114 ++++++++++++++++ M/doc/ru/keys.md | 18 +++ M/doc/ru/title.html | 115 ++++++++++++++++ M/doc/ru/title.md | 23 ++++ M/doc/ru/tracking.html | 114 ++++++++++++++++ M/doc/ru/tracking.md | 22 +++ M/index.html | 2 +- 33 files changed, 1747 insertions(+), 1 deletion(-) create mode 100644 M/3.4/игра.html create mode 100644 M/3.4/игра/050.Заголовок.js create mode 100644 M/3.4/игра/100.Изображения.js create mode 100644 M/3.4/игра/120.Физика.js create mode 100644 M/3.4/игра/140.Тела.js create mode 100644 M/3.4/игра/160.Слежение.js create mode 100644 M/3.4/игра/700.Игра.js create mode 120000 M/3.4/игра/matter-js create mode 100644 M/3.4/общее/100.События.js create mode 100644 M/3.4/общее/150.Состояние.js create mode 100644 M/3.4/общее/200.функции.js create mode 120000 M/3.4/общее/base64-js create mode 120000 M/3.4/общее/pako create mode 100644 M/3.4/редактор.html create mode 100644 M/3.4/редактор/100.Редактор.js create mode 100644 M/3.4/редактор/200.Пульт.js create mode 100644 M/3.4/редактор/700.Муром.js create mode 120000 M/3.4/редактор/ace create mode 120000 M/3.4/редактор/uikit create mode 100644 M/doc/pskov.cfg create mode 100644 M/doc/ru/bodies.html create mode 100644 M/doc/ru/bodies.md create mode 100644 M/doc/ru/images.html create mode 100644 M/doc/ru/images.md create mode 100644 M/doc/ru/index.html create mode 100644 M/doc/ru/item.template create mode 100644 M/doc/ru/keys.html create mode 100644 M/doc/ru/keys.md create mode 100644 M/doc/ru/title.html create mode 100644 M/doc/ru/title.md create mode 100644 M/doc/ru/tracking.html create mode 100644 M/doc/ru/tracking.md diff --git a/M/3.4/игра.html b/M/3.4/игра.html new file mode 100644 index 0000000..06fa29e --- /dev/null +++ b/M/3.4/игра.html @@ -0,0 +1,36 @@ + + + + + + + + + + +
+
+
+ + + + + + + + + + + + + diff --git a/M/3.4/игра/050.Заголовок.js b/M/3.4/игра/050.Заголовок.js new file mode 100644 index 0000000..2e47500 --- /dev/null +++ b/M/3.4/игра/050.Заголовок.js @@ -0,0 +1,10 @@ +function Заголовок() +{ + this.обработатьКлюч = function(ключ, путь, значение) + { + if (ключ == "заголовок") + { + document.title = значение; + } + } +} diff --git a/M/3.4/игра/100.Изображения.js b/M/3.4/игра/100.Изображения.js new file mode 100644 index 0000000..40da647 --- /dev/null +++ b/M/3.4/игра/100.Изображения.js @@ -0,0 +1,104 @@ +function Изображения(корень) +{ + this.создать = function() + { + this.умолчание = { + x: 0, + y: 0, + ширина: 100, + высота: 100, + угол: 0, + }; + this.задано = {}; + this.элементы = {}; + }; + + this.создатьИлиПолучитьЭлемент = function(имя) + { + var эл = this.элементы[имя]; + if (эл) + { + return эл; + } + + var ум = this.умолчание; + эл = document.createElement("div"); + эл.id = `изображения-${имя}`; + эл.style.position = "absolute"; + эл.style.display = "block"; + // Свойства по умолчанию. + эл.style.left = `${ум.x}px`; + эл.style.top = `${ум.y}px`; + эл.style.width = `${ум.ширина}px`; + эл.style.height = `${ум.высота}px`; + эл.style.transform = `rotate(${ум.угол}rad)`; + + this.элементы[имя] = эл; + корень.appendChild(эл); + return эл; + }; + + this.обновитьЭлемент = function(имя, свойство, значение) + { + if (!this.задано[имя]) + { + this.задано[имя] = {}; + } + this.задано[имя][свойство] = значение; + var за = this.задано[имя]; + var эл = this.создатьИлиПолучитьЭлемент(имя); + + if (свойство == "ширина") + { + эл.style.width = `${за.ширина}px`; + } + else if (свойство == "высота") + { + эл.style.height = `${за.высота}px`; + } + else if ( + (свойство == "x") || + (свойство == "y") || + (свойство == "угол") || + (свойство == "вид.transform") + ) { + var ум = this.умолчание; + var x = за.x ? за.x : ум.x; + var y = за.y ? за.y : ум.y; + var угол = за.угол ? за.угол : ум.угол; + this.обновитьРасположение(имя, x, y, угол); + } + else if (свойство.startsWith("вид")) + { + var параметр = свойство.substring(4); + эл.style.setProperty(параметр, значение); + } + }; + + this.обновитьРасположение = function(имя, x, y, угол) + { + var за = this.задано[имя]; + var эл = this.элементы[имя]; + эл.style.left = `${x}px`; + эл.style.top = `${y}px`; + var transform = `rotate(${угол}deg) `; + if (за["вид.transform"]) + { + transform += за["вид.transform"]; + } + эл.style.transform = transform; + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + if (путь[0] == "изображения") + { + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + this.обновитьЭлемент(имя, свойство, значение); + } + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/игра/120.Физика.js b/M/3.4/игра/120.Физика.js new file mode 100644 index 0000000..4f8ccbb --- /dev/null +++ b/M/3.4/игра/120.Физика.js @@ -0,0 +1,19 @@ +function Физика() +{ + this.создать = function() + { + this.движок = Matter.Engine.create({ + enableSleeping: true, + gravity: { + y: 2, + }, + }); + }; + + this.обновить = function() { + Matter.Engine.update(this.движок); + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/игра/140.Тела.js b/M/3.4/игра/140.Тела.js new file mode 100644 index 0000000..43621bf --- /dev/null +++ b/M/3.4/игра/140.Тела.js @@ -0,0 +1,123 @@ +function Тела(события, физмир) +{ + this.создать = function() + { + this.умолчание = { + x: 0, + y: 0, + ширина: 40, + высота: 20, + часть: false, + физика: { + isStatic: true, + }, + }; + + this.задано = {}; + this.тела = {}; + this.имена = {}; + события.подписать(this); + }; + + this.именаЧастей = function(за) + { + var имена = []; + for (var ключ in за) + { + if (ключ.startsWith("части")) + { + имена.push(за[ключ]); + } + } + return имена; + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + if (путь[0] != "тела") + { + return; + } + + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + if (!this.задано[имя]) + { + this.задано[имя] = {}; + } + this.задано[имя][свойство] = значение; + + this.пересоздатьТело(имя); + }; + + this.пересоздатьТело = function(имя) { + // Удаляем старое тело. + if (имя in this.тела) + { + var тело = this.тела[имя]; + delete this.имена[тело.id]; + // Всегда удаляем из мира: и составные, и несоставные тела. + Matter.Composite.remove(физмир, тело); + } + + var за = this.задано[имя]; + var ум = this.умолчание; + var x = (за.x != null) ? за.x : ум.x; + var y = (за.y != null) ? за.y : ум.y; + var ширина = за.ширина ? за.ширина : ум.ширина; + var высота = за.высота ? за.высота : ум.высота; + // Переводим x,y из левого верхнего угла в центр. + x = x + ширина / 2.0; + y = y + высота / 2.0; + // Параметры тела. + var параметры = {}; + Object.assign(параметры, ум.физика); + for (var путь in за) + { + if (путь.startsWith("физика")) + { + var свойство = путь.slice(7); + мир.задатьПолныйКлюч(параметры, свойство, за[путь]); + } + } + + var тело = null; + // Создаём новое составное тело. + if (за["части.0"]) + { + параметры["parts"] = this.телаЧастей(this.именаЧастей(за)); + тело = Matter.Body.create(параметры); + } + // Создаём новое несоставное тело. + // Вполне может быть частью другого составного тела. + else + { + тело = Matter.Bodies.rectangle(x, y, ширина, высота, параметры); + } + this.тела[имя] = тело; + this.имена[тело.id] = имя; + + // Добавляем тело в физический мир, если оно не является частью другого составного тела. + var часть = за.часть ? за.часть : ум.часть; + if (!часть) + { + Matter.Composite.add(физмир, тело); + } + }; + + this.телаЧастей = function(имена) + { + var тела = []; + for (var н in имена) + { + var имя = имена[н]; + var тело = this.тела[имя]; + тела.push(тело); + } + return тела; + }; + + // Конструктор. + this.создать(); +} + diff --git a/M/3.4/игра/160.Слежение.js b/M/3.4/игра/160.Слежение.js new file mode 100644 index 0000000..2c7de17 --- /dev/null +++ b/M/3.4/игра/160.Слежение.js @@ -0,0 +1,97 @@ +function Слежение(события, изображения, тела) +{ + this.создать = function() + { + this.умолчание = { + смещение: [0, 0], + скорость: 1, + предел: 0, + }; + this.задано = {}; + события.подписать(this); + }; + + this.обновить = function() + { + for (var имя in this.задано) + { + var за = this.задано[имя]; + this.расположитьИзображение(за); + } + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + if (путь[0] != "слежение") + { + return; + } + + var имя = путь[1]; + var свойство = путь.slice(2).join("."); + if (!this.задано[имя]) + { + this.задано[имя] = {}; + } + this.задано[имя][свойство] = значение; + }; + + this.расположитьИзображение = function(за) + { + var тело = тела.тела[за.тело]; + if (!тело) + { + return; + } + + var элемент = изображения.элементы[за.изображение]; + var ум = 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, скорость, предел); + + элемент.dataset.слежениеX = x; + элемент.dataset.слежениеY = y; + изображения.обновитьРасположение(за.изображение, 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.создать(); +}; diff --git a/M/3.4/игра/700.Игра.js b/M/3.4/игра/700.Игра.js new file mode 100644 index 0000000..d165066 --- /dev/null +++ b/M/3.4/игра/700.Игра.js @@ -0,0 +1,65 @@ +function Игра() +{ + this.создать = function() + { + var корень = document.getElementById("корень"); + мир.события = new События(); + мир.состояние = new Состояние(); + мир.состояние.обработчик = (к, п, з) => { this.обработатьКлюч(к, п, з) }; + мир.физика = new Физика(); + мир.изображения = new Изображения(корень), + мир.тела = new Тела(мир.события, мир.физика.движок.world); + мир.слежение = new Слежение(мир.события, мир.изображения, мир.тела); + this.ключники = [ + new Заголовок(), + мир.изображения, + мир.тела, + мир.слежение, + ]; + + var z64 = мир.параметрыЗапуска()["z64"]; + this.исполнитьКод(z64); + this.отслеживатьОбновленияКода(); + this.обновить(); + }; + + this.исполнитьКод = function(z64) + { + if (z64) + { + var код = мир.изZ64(z64); + eval(код); + } + }; + + this.обновить = function() + { + мир.физика.обновить(); + мир.слежение.обновить(); + + var тут = this; + requestAnimationFrame(function() { + тут.обновить(); + }); + }; + + this.обработатьКлюч = function(ключ, путь, значение) + { + for (var номер in this.ключники) + { + var ключник = this.ключники[номер]; + ключник.обработатьКлюч(ключ, путь, значение); + } + }; + + this.отслеживатьОбновленияКода = function() + { + var тут = this; + window.addEventListener("message", function(событие) { + тут.исполнитьКод(событие.data); + }); + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/игра/matter-js b/M/3.4/игра/matter-js new file mode 120000 index 0000000..3a19a2e --- /dev/null +++ b/M/3.4/игра/matter-js @@ -0,0 +1 @@ +../../стороннее/matter-js \ No newline at end of file diff --git a/M/3.4/общее/100.События.js b/M/3.4/общее/100.События.js new file mode 100644 index 0000000..19f8ecf --- /dev/null +++ b/M/3.4/общее/100.События.js @@ -0,0 +1,31 @@ +function События() +{ + this.создать = function() + { + this.обработчики = []; + }; + + this.подписать = function(обработчик) + { + this.обработчики.push(обработчик); + }; + + this.отписать = function(обработчик) { + var номер = this.обработчики.indexOf(обработчик); + if (номер != -1) + { + this.обработчики.splice(номер, 1); + } + }; + + this.уведомить = function(событие) { + for (var номер in this.обработчики) + { + var обработчик = this.обработчики[номер]; + обработчик.обработатьСобытие(событие); + } + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/общее/150.Состояние.js b/M/3.4/общее/150.Состояние.js new file mode 100644 index 0000000..5004890 --- /dev/null +++ b/M/3.4/общее/150.Состояние.js @@ -0,0 +1,61 @@ +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 && было == стало)) + { + новые[ключ] = стало; + this.значения[ключ] = стало; + } + } + return новые; + }; + + this.разобрать = function(словарь) { + var значения = this.лишьНовыеЗначения(this.выпрямить(словарь)); + for (var ключ in значения) + { + var путь = ключ.split("."); + var значение = значения[ключ]; + if (this.обработчик) + { + this.обработчик(ключ, путь, значение); + } + } + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/общее/200.функции.js b/M/3.4/общее/200.функции.js new file mode 100644 index 0000000..cca058c --- /dev/null +++ b/M/3.4/общее/200.функции.js @@ -0,0 +1,91 @@ +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 параметры; +}; + +мир.разобрать = function(словарь) +{ + мир.состояние.разобрать(словарь); +}; diff --git a/M/3.4/общее/base64-js b/M/3.4/общее/base64-js new file mode 120000 index 0000000..a3367c1 --- /dev/null +++ b/M/3.4/общее/base64-js @@ -0,0 +1 @@ +../../стороннее/base64-js \ No newline at end of file diff --git a/M/3.4/общее/pako b/M/3.4/общее/pako new file mode 120000 index 0000000..504d162 --- /dev/null +++ b/M/3.4/общее/pako @@ -0,0 +1 @@ +../../стороннее/pako \ No newline at end of file diff --git a/M/3.4/редактор.html b/M/3.4/редактор.html new file mode 100644 index 0000000..3ae085e --- /dev/null +++ b/M/3.4/редактор.html @@ -0,0 +1,102 @@ + + + + + M-3.4 + + + + + + + + + + + + + +
+
+   + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + +
3.4Документация
3.3тела, слежение
3.2мир.параметрыЗапуска, мир.разобрать, заголовок, изображения, состояние, физика
3.1Кнопки перезапуска, копирования ссылки, запуска в отдельной вкладке
3.0Проверка введённого кода на отсутствие синтаксических ошибок
+
+
+ + + + + + + + + + + + diff --git a/M/3.4/редактор/100.Редактор.js b/M/3.4/редактор/100.Редактор.js new file mode 100644 index 0000000..430d3a8 --- /dev/null +++ b/M/3.4/редактор/100.Редактор.js @@ -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.создать(); +} diff --git a/M/3.4/редактор/200.Пульт.js b/M/3.4/редактор/200.Пульт.js new file mode 100644 index 0000000..42889e5 --- /dev/null +++ b/M/3.4/редактор/200.Пульт.js @@ -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 = показать ? "" : " "; + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/редактор/700.Муром.js b/M/3.4/редактор/700.Муром.js new file mode 100644 index 0000000..fa45750 --- /dev/null +++ b/M/3.4/редактор/700.Муром.js @@ -0,0 +1,13 @@ +function Муром() +{ + this.создать = function() + { + мир.события = new События(); + мир.состояние = new Состояние(); + мир.редактор = new Редактор(мир.события, "редактор"); + мир.пульт = new Пульт(мир.события, "ошибка", "перезапустить", "отдельно", "ссылка", "документация"); + }; + + // Конструктор. + this.создать(); +} diff --git a/M/3.4/редактор/ace b/M/3.4/редактор/ace new file mode 120000 index 0000000..0190be9 --- /dev/null +++ b/M/3.4/редактор/ace @@ -0,0 +1 @@ +../../стороннее/ace \ No newline at end of file diff --git a/M/3.4/редактор/uikit b/M/3.4/редактор/uikit new file mode 120000 index 0000000..d60f2bc --- /dev/null +++ b/M/3.4/редактор/uikit @@ -0,0 +1 @@ +../../стороннее/uikit \ No newline at end of file diff --git a/M/doc/pskov.cfg b/M/doc/pskov.cfg new file mode 100644 index 0000000..e0a2176 --- /dev/null +++ b/M/doc/pskov.cfg @@ -0,0 +1,11 @@ +input = ru +item = item.template +preview = +index = +paginationPrev = +paginationNext = +paginationPrevNext = +previewSize = +previewEnding = +previewsPerPage = +previewPageBaseName = diff --git a/M/doc/ru/bodies.html b/M/doc/ru/bodies.html new file mode 100644 index 0000000..35194bb --- /dev/null +++ b/M/doc/ru/bodies.html @@ -0,0 +1,115 @@ + + + + + + + Документация МУРОМа + + + + +
+

+тела +

+
+
+
+

Добавление одного или нескольких тел, составных либо одиночных.

+

Тело представляет из себя сущность Matter.js с полной поддержкой свойств, которые можно указывать телам в Matter.js.

+

+

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

+ +

+

Пример № 2. Составное тело с сенсором и статичная платформа.

+ +

+ +
+ + + + diff --git a/M/doc/ru/bodies.md b/M/doc/ru/bodies.md new file mode 100644 index 0000000..791eb80 --- /dev/null +++ b/M/doc/ru/bodies.md @@ -0,0 +1,24 @@ +Title: тела +Date: 2021-09-27 00:00 +Category: Страница +Slug: bodies +Lang: ru + +Добавление одного или нескольких тел, составных либо одиночных. + +Тело представляет из себя сущность Matter.js с полной поддержкой свойств, которые можно указывать телам в Matter.js. + +
+ +Пример № 1. Отображение статичной платформы и падающего на неё самовара. + + + +
+ +Пример № 2. Составное тело с сенсором и статичная платформа. + + + +
+ diff --git a/M/doc/ru/images.html b/M/doc/ru/images.html new file mode 100644 index 0000000..1b931a9 --- /dev/null +++ b/M/doc/ru/images.html @@ -0,0 +1,116 @@ + + + + + + + Документация МУРОМа + + + + +
+

+изображения +

+
+
+
+

Добавление одного или нескольких изображений.

+

Изображения чаще всего являются статичным фоном уровня либо движущимся предметом/игроком.

+

Изображение представляет из себя отдельный <div>, который можно исследовать в отладке браузера.

+

+

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

+ +

+

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

+ +

+ +
+ + + + diff --git a/M/doc/ru/images.md b/M/doc/ru/images.md new file mode 100644 index 0000000..8672e87 --- /dev/null +++ b/M/doc/ru/images.md @@ -0,0 +1,26 @@ +Title: изображения +Date: 2021-09-24 00:00 +Category: Страница +Slug: images +Lang: ru + +Добавление одного или нескольких изображений. + +Изображения чаще всего являются статичным фоном уровня либо движущимся предметом/игроком. + +Изображение представляет из себя отдельный `
`, который можно исследовать в отладке браузера. + +
+ +Пример № 1. Отображение статичного изображения под углом. + + + +
+ +Пример № 2. Отображение статичной платформы и падающего на неё самовара. + + + +
+ diff --git a/M/doc/ru/index.html b/M/doc/ru/index.html new file mode 100644 index 0000000..c9243b6 --- /dev/null +++ b/M/doc/ru/index.html @@ -0,0 +1,4 @@ + + + + diff --git a/M/doc/ru/item.template b/M/doc/ru/item.template new file mode 100644 index 0000000..452af00 --- /dev/null +++ b/M/doc/ru/item.template @@ -0,0 +1,107 @@ + + + + + + + Документация МУРОМа + + + + +
+

+PSKOV_ITEM_TITLE +

+
+
+
+PSKOV_ITEM_CONTENTS +
+
+ + + + diff --git a/M/doc/ru/keys.html b/M/doc/ru/keys.html new file mode 100644 index 0000000..87dc859 --- /dev/null +++ b/M/doc/ru/keys.html @@ -0,0 +1,114 @@ + + + + + + + Документация МУРОМа + + + + +
+

+Ключи (API) +

+
+
+
+

Ниже представлены страницы с описанием каждого отдельного поддерживаемого ключа +и примерами их использования:

+
    +
  1. заголовок
  2. +
  3. изображения
  4. +
  5. слежение
  6. +
  7. тела
  8. +
+
+
+ + + + diff --git a/M/doc/ru/keys.md b/M/doc/ru/keys.md new file mode 100644 index 0000000..1742e98 --- /dev/null +++ b/M/doc/ru/keys.md @@ -0,0 +1,18 @@ +Title: Ключи (API) +Date: 2021-09-23 00:00 +Category: Страница +Slug: keys +Lang: ru + +Ниже представлены страницы с описанием каждого отдельного поддерживаемого ключа +и примерами их использования: + +1. [заголовок][title] +1. [изображения][images] +1. [слежение][tracking] +1. [тела][bodies] + +[bodies]: bodies.html +[images]: images.html +[title]: title.html +[tracking]: tracking.html diff --git a/M/doc/ru/title.html b/M/doc/ru/title.html new file mode 100644 index 0000000..1ca950e --- /dev/null +++ b/M/doc/ru/title.html @@ -0,0 +1,115 @@ + + + + + + + Документация МУРОМа + + + + +
+

+заголовок +

+
+
+
+

Задание заголовка страницы браузера. Чаще всего это название игры.

+

+

Пример:

+
мир.разобрать({
+    заголовок: "Колобок",
+});
+
+

Посмотреть результат.

+

+ +
+ + + + diff --git a/M/doc/ru/title.md b/M/doc/ru/title.md new file mode 100644 index 0000000..05d9e41 --- /dev/null +++ b/M/doc/ru/title.md @@ -0,0 +1,23 @@ +Title: заголовок +Date: 2021-09-23 00:00 +Category: Страница +Slug: title +Lang: ru + +Задание заголовка страницы браузера. Чаще всего это название игры. + +
+ +Пример: + +``` +мир.разобрать({ + заголовок: "Колобок", +}); +``` + +[Посмотреть результат][result]. + +
+ +[result]: ../../3.4/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM= diff --git a/M/doc/ru/tracking.html b/M/doc/ru/tracking.html new file mode 100644 index 0000000..ff3dc31 --- /dev/null +++ b/M/doc/ru/tracking.html @@ -0,0 +1,114 @@ + + + + + + + Документация МУРОМа + + + + +
+

+слежение +

+
+
+
+

Синхронизация изображения с телом. Исполняется каждый кадр.

+

+

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

+ +

+

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

+ +

+ +
+ + + + diff --git a/M/doc/ru/tracking.md b/M/doc/ru/tracking.md new file mode 100644 index 0000000..74e36e0 --- /dev/null +++ b/M/doc/ru/tracking.md @@ -0,0 +1,22 @@ +Title: слежение +Date: 2021-09-27 00:00 +Category: Страница +Slug: tracking +Lang: ru + +Синхронизация изображения с телом. Исполняется каждый кадр. + +
+ +Пример № 1. Мгновенное следование изображения за телом. + + + +
+ +Пример № 2. Замедленное следование изображения за телом со смещением и пределом для ограничения мельтешения. + + + +
+ diff --git a/M/index.html b/M/index.html index dd085eb..754a3bc 100644 --- a/M/index.html +++ b/M/index.html @@ -1,4 +1,4 @@ - +