@@ -0,0 +1,36 @@ | |||
<!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> | |||
<style> | |||
body { | |||
overflow: hidden; | |||
} | |||
#корень | |||
{ | |||
position: relative; | |||
} | |||
</style> | |||
</head> | |||
<body> | |||
<div id="заставка"></div> | |||
<div id="корень"></div> | |||
<div id="отладка"></div> | |||
<script src="общее/100.События.js"></script> | |||
<script src="общее/150.Состояние.js"></script> | |||
<script src="общее/200.функции.js"></script> | |||
<script src="игра/050.Заголовок.js"></script> | |||
<script src="игра/100.Изображения.js"></script> | |||
<script src="игра/120.Физика.js"></script> | |||
<script src="игра/140.Тела.js"></script> | |||
<script src="игра/160.Слежение.js"></script> | |||
<script src="игра/700.Игра.js"></script> | |||
<script> | |||
var игра = new Игра(); | |||
</script> | |||
</body> | |||
</html> |
@@ -0,0 +1,10 @@ | |||
function Заголовок() | |||
{ | |||
this.обработатьКлюч = function(ключ, путь, значение) | |||
{ | |||
if (ключ == "заголовок") | |||
{ | |||
document.title = значение; | |||
} | |||
} | |||
} |
@@ -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.создать(); | |||
} |
@@ -0,0 +1,19 @@ | |||
function Физика() | |||
{ | |||
this.создать = function() | |||
{ | |||
this.движок = Matter.Engine.create({ | |||
enableSleeping: true, | |||
gravity: { | |||
y: 2, | |||
}, | |||
}); | |||
}; | |||
this.обновить = function() { | |||
Matter.Engine.update(this.движок); | |||
}; | |||
// Конструктор. | |||
this.создать(); | |||
} |
@@ -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.создать(); | |||
} | |||
@@ -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.создать(); | |||
}; |
@@ -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.создать(); | |||
} |
@@ -0,0 +1 @@ | |||
../../стороннее/matter-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.создать(); | |||
} |
@@ -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.создать(); | |||
} |
@@ -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(словарь) | |||
{ | |||
мир.состояние.разобрать(словарь); | |||
}; |
@@ -0,0 +1 @@ | |||
../../стороннее/base64-js |
@@ -0,0 +1 @@ | |||
../../стороннее/pako |
@@ -0,0 +1,102 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | |||
<title>M-3.4</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="впульте"> </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>3.4</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="общее/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> |
@@ -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.создать(); | |||
} |
@@ -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>" : " "; | |||
}; | |||
// Конструктор. | |||
this.создать(); | |||
} |
@@ -0,0 +1,13 @@ | |||
function Муром() | |||
{ | |||
this.создать = function() | |||
{ | |||
мир.события = new События(); | |||
мир.состояние = new Состояние(); | |||
мир.редактор = new Редактор(мир.события, "редактор"); | |||
мир.пульт = new Пульт(мир.события, "ошибка", "перезапустить", "отдельно", "ссылка", "документация"); | |||
}; | |||
// Конструктор. | |||
this.создать(); | |||
} |
@@ -0,0 +1 @@ | |||
../../стороннее/ace |
@@ -0,0 +1 @@ | |||
../../стороннее/uikit |
@@ -0,0 +1,11 @@ | |||
input = ru | |||
item = item.template | |||
preview = | |||
index = | |||
paginationPrev = | |||
paginationNext = | |||
paginationPrevNext = | |||
previewSize = | |||
previewEnding = | |||
previewsPerPage = | |||
previewPageBaseName = |
@@ -0,0 +1,115 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</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>Тело представляет из себя сущность Matter.js с полной поддержкой свойств, которые можно указывать телам в Matter.js.</p> | |||
<p></div><div class="contents"></p> | |||
<p>Пример № 1. Отображение статичной платформы и падающего на неё самовара.</p> | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJy9VNtKw0AQfc9XLEXBgu1WsS8Rv8JHEbrGGGPTJGy2qJRCWxWUCr76Jv5BWowGL/UXZv/I2XpLtlFEwRDC7lzOnLOzE88WRPYgkX15JHv4HZI1UtoVIoxMSh1XVIPQ9h3WsiPR3naDasAd2gy4b3NOW3sR5WyfbnHmW7u0xSJhcyp7JcNDWHiGB4jlQB7DBEs8QozQjTb3FuY6+ZJdihEDFQ03cA+x2vbhCSYwhri6FzrlxuoUEq0xAk3tsvcN3Bj3Z5DSfEI19J0y8YMKt0ObCRJZPPA8UptXLyVW4Avm+ljLwJwU4xE3hjtMH6kVSjlf6BgEH0g/zXALCZJN5YVJXr2ZiOtsfYizEdOosRwiR6UeffXaYs4rTxULRHpS3hXNi5gp3OiI6tliVtPhQdvfNrUjyyN0P7eZ5Rvzq3z35FCvdGCSpSWN06ESMcMzq1HP0DX+SuTsVftaqJExIKVEZWbx8QYNUP4DjLDyfZFonePhbOf+0lcUoTqQqkkoEu5G64IJ1zLJDvMi+0ctnTmff2/mG5v3g+8joeR9ciDJN0AByJPpbF0WzRlar7NNKpirgvlUVUrFY1nSZLxeiwnG52+DHtdHEPWj+cDfqCzXFkllub75lXKjW159Af7tOUk="></iframe> | |||
<p></div><div class="contents"></p> | |||
<p>Пример № 2. Составное тело с сенсором и статичная платформа.</p> | |||
<iframe style="width: 100%; height: 100em" src="../../3.4/редактор.html?z64=eJy9VcFO20AQvfsrVhaViESyBJVDjfoVPSIkjHGNwbGt9UYtQpHilKpUqdRrb4g/MFHcWlDCL8z+EbOGEHvj4IhIWFHs3Zl5+97OzK5ncyL6kIpYfBN9/B+Sj0Q/4jyMDEodl7eC0PYds2NHvHvoBq2AOfQkYL7NGO0cR5SZX+gBM33riHbMiNuMir6ueQgL93ALiRiIc5jgEv8hQej9LvPW187KS/YoegykN4zhBhI5jOEOJjCCpHUcOo39nRwSZxMEyudF/wW4EY5/QkbLAa3QdxrED5rMDm2Tk8higeeRzXfyR4kV+Nx0fVxLw5gM/RE3gX8Yfi2/UMqv9TON4APZbBr+QopkM/HbII/WgsdVcX1Iih6510gMkaNUj7btzY2SVVxIFoh0J63vFStiZjBWEeVzYFonDgu6/qGhbFkZoTcbFj6fmaOqnNuKvLcqeZM64vPlo5B/gftlOVQM1cW+GkRhdSo3eI5pUWW7JjuvSk+tykKKtMIEUkplZBEfa3+A4m/hGle+qZDcVjmezudulYoUP1BKLNvEIJx1bcV6nmcnkx1etS1u9Imb3LUM8tn0InupUr1HvWMkeyHLe0nFH1ZQrNbyyoptPwpYVWy14HI3vzLFU9KQGWRXL1eNvkH08q7qe2+RRqUJ3rhfn7hMeytGOun0WIe03GMSQHzPD/4/Sx3xFVeFxNSrbwhdIf3Y5xP0VxNV9osRRN55z/i7TSxW0tza3ltUSaqQy1na50/MehmF62KxCKW26kW0F4l4emm9xs4D+tFt+Q=="></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> | |||
@@ -0,0 +1,24 @@ | |||
Title: тела | |||
Date: 2021-09-27 00:00 | |||
Category: Страница | |||
Slug: bodies | |||
Lang: ru | |||
Добавление одного или нескольких тел, составных либо одиночных. | |||
Тело представляет из себя сущность Matter.js с полной поддержкой свойств, которые можно указывать телам в Matter.js. | |||
</div><div class="contents"> | |||
Пример № 1. Отображение статичной платформы и падающего на неё самовара. | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJy9VNtKw0AQfc9XLEXBgu1WsS8Rv8JHEbrGGGPTJGy2qJRCWxWUCr76Jv5BWowGL/UXZv/I2XpLtlFEwRDC7lzOnLOzE88WRPYgkX15JHv4HZI1UtoVIoxMSh1XVIPQ9h3WsiPR3naDasAd2gy4b3NOW3sR5WyfbnHmW7u0xSJhcyp7JcNDWHiGB4jlQB7DBEs8QozQjTb3FuY6+ZJdihEDFQ03cA+x2vbhCSYwhri6FzrlxuoUEq0xAk3tsvcN3Bj3Z5DSfEI19J0y8YMKt0ObCRJZPPA8UptXLyVW4Avm+ljLwJwU4xE3hjtMH6kVSjlf6BgEH0g/zXALCZJN5YVJXr2ZiOtsfYizEdOosRwiR6UeffXaYs4rTxULRHpS3hXNi5gp3OiI6tliVtPhQdvfNrUjyyN0P7eZ5Rvzq3z35FCvdGCSpSWN06ESMcMzq1HP0DX+SuTsVftaqJExIKVEZWbx8QYNUP4DjLDyfZFonePhbOf+0lcUoTqQqkkoEu5G64IJ1zLJDvMi+0ctnTmff2/mG5v3g+8joeR9ciDJN0AByJPpbF0WzRlar7NNKpirgvlUVUrFY1nSZLxeiwnG52+DHtdHEPWj+cDfqCzXFkllub75lXKjW159Af7tOUk="></iframe> | |||
</div><div class="contents"> | |||
Пример № 2. Составное тело с сенсором и статичная платформа. | |||
<iframe style="width: 100%; height: 100em" src="../../3.4/редактор.html?z64=eJy9VcFO20AQvfsrVhaViESyBJVDjfoVPSIkjHGNwbGt9UYtQpHilKpUqdRrb4g/MFHcWlDCL8z+EbOGEHvj4IhIWFHs3Zl5+97OzK5ncyL6kIpYfBN9/B+Sj0Q/4jyMDEodl7eC0PYds2NHvHvoBq2AOfQkYL7NGO0cR5SZX+gBM33riHbMiNuMir6ueQgL93ALiRiIc5jgEv8hQej9LvPW187KS/YoegykN4zhBhI5jOEOJjCCpHUcOo39nRwSZxMEyudF/wW4EY5/QkbLAa3QdxrED5rMDm2Tk8higeeRzXfyR4kV+Nx0fVxLw5gM/RE3gX8Yfi2/UMqv9TON4APZbBr+QopkM/HbII/WgsdVcX1Iih6510gMkaNUj7btzY2SVVxIFoh0J63vFStiZjBWEeVzYFonDgu6/qGhbFkZoTcbFj6fmaOqnNuKvLcqeZM64vPlo5B/gftlOVQM1cW+GkRhdSo3eI5pUWW7JjuvSk+tykKKtMIEUkplZBEfa3+A4m/hGle+qZDcVjmezudulYoUP1BKLNvEIJx1bcV6nmcnkx1etS1u9Imb3LUM8tn0InupUr1HvWMkeyHLe0nFH1ZQrNbyyoptPwpYVWy14HI3vzLFU9KQGWRXL1eNvkH08q7qe2+RRqUJ3rhfn7hMeytGOun0WIe03GMSQHzPD/4/Sx3xFVeFxNSrbwhdIf3Y5xP0VxNV9osRRN55z/i7TSxW0tza3ltUSaqQy1na50/MehmF62KxCKW26kW0F4l4emm9xs4D+tFt+Q=="></iframe> | |||
</div> | |||
@@ -0,0 +1,116 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</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>Изображения чаще всего являются статичным фоном уровня либо движущимся предметом/игроком.</p> | |||
<p>Изображение представляет из себя отдельный <code><div></code>, который можно исследовать в отладке браузера.</p> | |||
<p></div><div class="contents"></p> | |||
<p>Пример № 1. Отображение статичного изображения под углом.</p> | |||
<iframe style="width: 100%; height: 25em" src="../../3.4/редактор.html?z64=eJxtkE1uwjAQhfecwmIFUpUBqWzc0xiIzE8TR46jFlVIgW6QWomrpC20UYH0CjM36hgqUSLexjPvzdifjHssKQ8oxwK/sMI3X9GSXltPDcHC8mzjJ27xwPNrKU7pceKHsxL3uKX8v+/1KEW307m58GZS1Bx8pxdaYEVLLK4s0Moj8hMHH/fq6TN+MOBOitte/Vre2dSRvPpqMNXWZPFQimZm71sj55JUAuixC0wSxlpFYeqy4dgExmqYGhuH1kI0ScGqB+hbFQ9GEKnUhRYohyP7jn9og99Y+HbBtBUTFMEk0e3mJdn83P6VfMzbdw2vX92vltE="></iframe> | |||
<p></div><div class="contents"></p> | |||
<p>Пример № 2. Отображение статичной платформы и падающего на неё самовара.</p> | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJy9VNtKw0AQfc9XLEXBgu1WsS8Rv8JHEbrGGGPTJGy2qJRCWxWUCr76Jv5BWowGL/UXZv/I2XpLtlFEwRDC7lzOnLOzE88WRPYgkX15JHv4HZI1UtoVIoxMSh1XVIPQ9h3WsiPR3naDasAd2gy4b3NOW3sR5WyfbnHmW7u0xSJhcyp7JcNDWHiGB4jlQB7DBEs8QozQjTb3FuY6+ZJdihEDFQ03cA+x2vbhCSYwhri6FzrlxuoUEq0xAk3tsvcN3Bj3Z5DSfEI19J0y8YMKt0ObCRJZPPA8UptXLyVW4Avm+ljLwJwU4xE3hjtMH6kVSjlf6BgEH0g/zXALCZJN5YVJXr2ZiOtsfYizEdOosRwiR6UeffXaYs4rTxULRHpS3hXNi5gp3OiI6tliVtPhQdvfNrUjyyN0P7eZ5Rvzq3z35FCvdGCSpSWN06ESMcMzq1HP0DX+SuTsVftaqJExIKVEZWbx8QYNUP4DjLDyfZFonePhbOf+0lcUoTqQqkkoEu5G64IJ1zLJDvMi+0ctnTmff2/mG5v3g+8joeR9ciDJN0AByJPpbF0WzRlar7NNKpirgvlUVUrFY1nSZLxeiwnG52+DHtdHEPWj+cDfqCzXFkllub75lXKjW159Af7tOUk="></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> | |||
@@ -0,0 +1,26 @@ | |||
Title: изображения | |||
Date: 2021-09-24 00:00 | |||
Category: Страница | |||
Slug: images | |||
Lang: ru | |||
Добавление одного или нескольких изображений. | |||
Изображения чаще всего являются статичным фоном уровня либо движущимся предметом/игроком. | |||
Изображение представляет из себя отдельный `<div>`, который можно исследовать в отладке браузера. | |||
</div><div class="contents"> | |||
Пример № 1. Отображение статичного изображения под углом. | |||
<iframe style="width: 100%; height: 25em" src="../../3.4/редактор.html?z64=eJxtkE1uwjAQhfecwmIFUpUBqWzc0xiIzE8TR46jFlVIgW6QWomrpC20UYH0CjM36hgqUSLexjPvzdifjHssKQ8oxwK/sMI3X9GSXltPDcHC8mzjJ27xwPNrKU7pceKHsxL3uKX8v+/1KEW307m58GZS1Bx8pxdaYEVLLK4s0Moj8hMHH/fq6TN+MOBOitte/Vre2dSRvPpqMNXWZPFQimZm71sj55JUAuixC0wSxlpFYeqy4dgExmqYGhuH1kI0ScGqB+hbFQ9GEKnUhRYohyP7jn9og99Y+HbBtBUTFMEk0e3mJdn83P6VfMzbdw2vX92vltE="></iframe> | |||
</div><div class="contents"> | |||
Пример № 2. Отображение статичной платформы и падающего на неё самовара. | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJy9VNtKw0AQfc9XLEXBgu1WsS8Rv8JHEbrGGGPTJGy2qJRCWxWUCr76Jv5BWowGL/UXZv/I2XpLtlFEwRDC7lzOnLOzE88WRPYgkX15JHv4HZI1UtoVIoxMSh1XVIPQ9h3WsiPR3naDasAd2gy4b3NOW3sR5WyfbnHmW7u0xSJhcyp7JcNDWHiGB4jlQB7DBEs8QozQjTb3FuY6+ZJdihEDFQ03cA+x2vbhCSYwhri6FzrlxuoUEq0xAk3tsvcN3Bj3Z5DSfEI19J0y8YMKt0ObCRJZPPA8UptXLyVW4Avm+ljLwJwU4xE3hjtMH6kVSjlf6BgEH0g/zXALCZJN5YVJXr2ZiOtsfYizEdOosRwiR6UeffXaYs4rTxULRHpS3hXNi5gp3OiI6tliVtPhQdvfNrUjyyN0P7eZ5Rvzq3z35FCvdGCSpSWN06ESMcMzq1HP0DX+SuTsVftaqJExIKVEZWbx8QYNUP4DjLDyfZFonePhbOf+0lcUoTqQqkkoEu5G64IJ1zLJDvMi+0ctnTmff2/mG5v3g+8joeR9ciDJN0AByJPpbF0WzRlar7NNKpirgvlUVUrFY1nSZLxeiwnG52+DHtdHEPWj+cDfqCzXFkllub75lXKjW159Af7tOUk="></iframe> | |||
</div> | |||
@@ -0,0 +1,4 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta http-equiv="refresh" content="0; URL='keys.html'"/> | |||
</html> |
@@ -0,0 +1,107 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</strong> | |||
<a href="http://opengamestudio.org/M">МУРОМ</a> | |||
<a href="keys.html">Ключи (API)</a> | |||
</div> | |||
<center> | |||
<h1> | |||
PSKOV_ITEM_TITLE | |||
</h1> | |||
</center> | |||
<center> | |||
<div class="contents"> | |||
PSKOV_ITEM_CONTENTS | |||
</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> | |||
@@ -0,0 +1,114 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</strong> | |||
<a href="http://opengamestudio.org/M">МУРОМ</a> | |||
<a href="keys.html">Ключи (API)</a> | |||
</div> | |||
<center> | |||
<h1> | |||
Ключи (API) | |||
</h1> | |||
</center> | |||
<center> | |||
<div class="contents"> | |||
<p>Ниже представлены страницы с описанием каждого отдельного поддерживаемого ключа | |||
и примерами их использования:</p> | |||
<ol> | |||
<li><a href="title.html">заголовок</a></li> | |||
<li><a href="images.html">изображения</a></li> | |||
<li><a href="tracking.html">слежение</a></li> | |||
<li><a href="bodies.html">тела</a></li> | |||
</ol> | |||
</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> | |||
@@ -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 |
@@ -0,0 +1,115 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</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>Пример:</p> | |||
<pre><code>мир.разобрать({ | |||
заголовок: "Колобок", | |||
}); | |||
</code></pre> | |||
<p><a href="../../3.4/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM=">Посмотреть результат</a>.</p> | |||
<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> | |||
@@ -0,0 +1,23 @@ | |||
Title: заголовок | |||
Date: 2021-09-23 00:00 | |||
Category: Страница | |||
Slug: title | |||
Lang: ru | |||
Задание заголовка страницы браузера. Чаще всего это название игры. | |||
</div><div class="contents"> | |||
Пример: | |||
``` | |||
мир.разобрать({ | |||
заголовок: "Колобок", | |||
}); | |||
``` | |||
[Посмотреть результат][result]. | |||
</div> | |||
[result]: ../../3.4/игра.html?z64=eJy7sOfCjosNehcbLmy4sP3CvgsbQayLTRd7NKq5FIAAKLjhwmagxG4g3gTEu6wUlC7MggpsBAko6XDValoDAL+VLNM= |
@@ -0,0 +1,114 @@ | |||
<!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> | |||
Документация МУРОМа | |||
</title> | |||
</head> | |||
<body> | |||
<div id="header"> | |||
<strong id="title">Документация МУРОМа</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: 60em" src="../../3.4/редактор.html?z64=eJzVVFtKw0AU/c8qhqLQgs3UYn8irsJPETqNMU1NkzCZoiKFtiooFVyDO4il0eCjbuHOjrxTX3lYFf1yCGFm7r3nnpMzE9cSRA4glkN5LAf4HpMNUmoLEYQGpbYjdD+wPJt1rVD0dhxf97lN93zuWZzTbieknO3TFmee2aZdFgqLUzkoaS7CwhPcQyRH8gRm2OIBIoRu9rhbXjrKtuxTzBipbJjCHURqOYRHmMEEIr0T2JXm+hwSdyMEmu/LwRdwE1yfQ0KzBXrg2RXi+VVuBRYTJDS577qktqweSkzfE8zxsJeGNQnmI24Et1h+rWYo5aJ8pBEckHxsww3ESDaRlwZ5iaqR7ZyOzOsncowZSnVkkEZtJROVZ6o79nhU0bVcFBETmOYR1Wgxc8/mfs/bMXL9swj9j2VqWvQr3+PAIDkuh4pegV9a2+o32n4lrkh1sUAttYGUYlX5c6MOlIKi6Lxjf/ETRajTlKiT/5lwJ9wUTDimQXaZG1r/wspXLm+ffYh04rd7AnHu8yOAPJ3fpKu0FUXSn906hVbKeljK0XwxffZt3hBD6rfxjrtVrddWSLXe2F6kTOtX1p8Bv1gVxQ=="></iframe> | |||
<p></div><div class="contents"></p> | |||
<p>Пример № 2. Замедленное следование изображения за телом со смещением и пределом для ограничения мельтешения.</p> | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJzVVF1O20AQfs8pVlGRiJR4AyovRj1FHxESi3GNE8e21hsRFEVKKEggkDhDb+BGuLXSEq4we6POmNLYa/4ET11FkXdn5pvvm9mdwFVMTyHTM/1VT/H/kn1izUOl4sTm3POVFcVu6ImBm6jhgR9ZkfR4P5KhKyUf9BIuxRHflyJ0DvlAJMqVXE+bjQBh4Q5+QapP9CksMcVvSBF6byiD9Q/jasoJR48T8oYbWEBK2xncwhLmkFq92GvtbReQeJoiUHGup8/AzXF/ATmvBlhx6LVYGHWkG7tCscSRURCw7hr9OHOiUAk/xFwNjMnRH3FT+Inh3+kLpVytjxsMF+SrY/gBGZLN9bXN7q20qpnLliJ+ri/Rg1SnNtvqtitWfU7ZMcctWT8aVkTM4cZEpLUvnL4no2F4YBv5qwiT1bb0We+XmWNkM4PLMdGr8Str23hB25vE1ak+LbBROkBKGUW+vlEjUlAXbXbsPf1EEXSbcrr5jwn3k89KKN+x2RcRJO5/0cq/XB7KPkM62cM7gcwoPwLos+IlfSu3ok76sVdHaM1qD5sGzfumL1/0m6GJxsY/3J3OZrfNOptbuzXPRVFYHFM0FLCWVnfDKN0dDSWcZ5i7eiNWtZm0tv8AHwUuww=="></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> | |||
@@ -0,0 +1,22 @@ | |||
Title: слежение | |||
Date: 2021-09-27 00:00 | |||
Category: Страница | |||
Slug: tracking | |||
Lang: ru | |||
Синхронизация изображения с телом. Исполняется каждый кадр. | |||
</div><div class="contents"> | |||
Пример № 1. Мгновенное следование изображения за телом. | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJzVVFtKw0AU/c8qhqLQgs3UYn8irsJPETqNMU1NkzCZoiKFtiooFVyDO4il0eCjbuHOjrxTX3lYFf1yCGFm7r3nnpMzE9cSRA4glkN5LAf4HpMNUmoLEYQGpbYjdD+wPJt1rVD0dhxf97lN93zuWZzTbieknO3TFmee2aZdFgqLUzkoaS7CwhPcQyRH8gRm2OIBIoRu9rhbXjrKtuxTzBipbJjCHURqOYRHmMEEIr0T2JXm+hwSdyMEmu/LwRdwE1yfQ0KzBXrg2RXi+VVuBRYTJDS577qktqweSkzfE8zxsJeGNQnmI24Et1h+rWYo5aJ8pBEckHxsww3ESDaRlwZ5iaqR7ZyOzOsncowZSnVkkEZtJROVZ6o79nhU0bVcFBETmOYR1Wgxc8/mfs/bMXL9swj9j2VqWvQr3+PAIDkuh4pegV9a2+o32n4lrkh1sUAttYGUYlX5c6MOlIKi6Lxjf/ETRajTlKiT/5lwJ9wUTDimQXaZG1r/wspXLm+ffYh04rd7AnHu8yOAPJ3fpKu0FUXSn906hVbKeljK0XwxffZt3hBD6rfxjrtVrddWSLXe2F6kTOtX1p8Bv1gVxQ=="></iframe> | |||
</div><div class="contents"> | |||
Пример № 2. Замедленное следование изображения за телом со смещением и пределом для ограничения мельтешения. | |||
<iframe style="width: 100%; height: 60em" src="../../3.4/редактор.html?z64=eJzVVF1O20AQfs8pVlGRiJR4AyovRj1FHxESi3GNE8e21hsRFEVKKEggkDhDb+BGuLXSEq4we6POmNLYa/4ET11FkXdn5pvvm9mdwFVMTyHTM/1VT/H/kn1izUOl4sTm3POVFcVu6ImBm6jhgR9ZkfR4P5KhKyUf9BIuxRHflyJ0DvlAJMqVXE+bjQBh4Q5+QapP9CksMcVvSBF6byiD9Q/jasoJR48T8oYbWEBK2xncwhLmkFq92GvtbReQeJoiUHGup8/AzXF/ATmvBlhx6LVYGHWkG7tCscSRURCw7hr9OHOiUAk/xFwNjMnRH3FT+Inh3+kLpVytjxsMF+SrY/gBGZLN9bXN7q20qpnLliJ+ri/Rg1SnNtvqtitWfU7ZMcctWT8aVkTM4cZEpLUvnL4no2F4YBv5qwiT1bb0We+XmWNkM4PLMdGr8Str23hB25vE1ak+LbBROkBKGUW+vlEjUlAXbXbsPf1EEXSbcrr5jwn3k89KKN+x2RcRJO5/0cq/XB7KPkM62cM7gcwoPwLos+IlfSu3ok76sVdHaM1qD5sGzfumL1/0m6GJxsY/3J3OZrfNOptbuzXPRVFYHFM0FLCWVnfDKN0dDSWcZ5i7eiNWtZm0tv8AHwUuww=="></iframe> | |||
</div> | |||
@@ -1,4 +1,4 @@ | |||
<!DOCTYPE html> | |||
<html> | |||
<meta http-equiv="refresh" content="0; URL='3.3/редактор/index.html'"/> | |||
<meta http-equiv="refresh" content="0; URL='3.4/редактор.html'"/> | |||
</html> |