@@ -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,26 @@ | |||||
function вZ64(строка) | |||||
{ | |||||
var байты = new TextEncoder("utf-8").encode(строка); | |||||
var архив = pako.deflate(байты, { to: 'string' }); | |||||
return base64js.fromByteArray(архив); | |||||
} | |||||
function изZ64(строка) | |||||
{ | |||||
var архив = base64js.toByteArray(строка); | |||||
var байты = pako.inflate(архив); | |||||
return new TextDecoder("utf-8").decode(байты); | |||||
} | |||||
function uuid() | |||||
{ | |||||
// 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); | |||||
} | |||||
); | |||||
} |
@@ -0,0 +1,31 @@ | |||||
function ПараметрыЗапуска() | |||||
{ | |||||
this.создать = function() { | |||||
this.параметры = {}; | |||||
var запрос = window.location.search.substring(1); | |||||
var аргументы = запрос.split("&"); | |||||
for (var номер in аргументы) | |||||
{ | |||||
var арг = аргументы[номер]; | |||||
var позицияЗнака = арг.indexOf("="); | |||||
// Лишь ключ. | |||||
if (позицияЗнака == -1) | |||||
{ | |||||
var ключ = decodeURIComponent(арг); | |||||
this.параметры[ключ] = null; | |||||
} | |||||
// Ключ со значением. | |||||
else | |||||
{ | |||||
var сыройКлюч = арг.slice(0, позицияЗнака); | |||||
var сыроеЗначение = арг.slice(позицияЗнака + 1); | |||||
var ключ = decodeURIComponent(сыройКлюч); | |||||
var значение = decodeURIComponent(сыроеЗначение); | |||||
this.параметры[ключ] = значение; | |||||
} | |||||
} | |||||
}; | |||||
// Конструктор. | |||||
this.создать(); | |||||
} |
@@ -0,0 +1,22 @@ | |||||
function Игра() | |||||
{ | |||||
this.создать = function() | |||||
{ | |||||
this.события = new События(); | |||||
this.пз = new ПараметрыЗапуска(); | |||||
this.исполнитьКод(); | |||||
}; | |||||
this.исполнитьКод = function() | |||||
{ | |||||
var z64 = this.пз.параметры["z64"]; | |||||
if (z64) | |||||
{ | |||||
var код = изZ64(z64); | |||||
/**/console.debug("Игра.исполнитьКод:", код); | |||||
} | |||||
}; | |||||
// Конструктор. | |||||
this.создать(); | |||||
} |
@@ -3,6 +3,18 @@ function Игра() | |||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
this.события = new События(); | this.события = new События(); | ||||
this.пз = new ПараметрыЗапуска(); | |||||
this.исполнитьКод(); | |||||
}; | |||||
this.исполнитьКод = function() | |||||
{ | |||||
var z64 = this.пз.параметры["z64"]; | |||||
if (z64) | |||||
{ | |||||
var код = изZ64(z64); | |||||
/**/console.debug("Игра.исполнитьКод:", код); | |||||
} | |||||
}; | }; | ||||
// Конструктор. | // Конструктор. | ||||
@@ -4,6 +4,7 @@ | |||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> | ||||
<script src="../общее/base64-js/base64js.min.js"></script> | <script src="../общее/base64-js/base64js.min.js"></script> | ||||
<script src="../общее/pako/pako.min.js"></script> | <script src="../общее/pako/pako.min.js"></script> | ||||
<script src="matter-js/matter.min.js"></script> | |||||
<style> | <style> | ||||
</style> | </style> | ||||
</head> | </head> | ||||
@@ -12,8 +13,10 @@ | |||||
<div id="корень"></div> | <div id="корень"></div> | ||||
<div id="отладка"></div> | <div id="отладка"></div> | ||||
<script src="../общее/100.события.js"></script> | |||||
<script src="700.игра.js"></script> | |||||
<script src="../общее/100.События.js"></script> | |||||
<script src="../общее/200.функции.js"></script> | |||||
<script src="../общее/300.ПараметрыЗапуска.js"></script> | |||||
<script src="700.Игра.js"></script> | |||||
<script> | <script> | ||||
var игра = new Игра(); | var игра = new Игра(); | ||||
</script> | </script> | ||||
@@ -0,0 +1 @@ | |||||
https://github.com/liabru/matter-js/blob/master/build/matter.min.js |
@@ -0,0 +1,89 @@ | |||||
function Редактор(события, имяРедактора, имяВоспроизведения) | |||||
{ | |||||
this.создать = function() | |||||
{ | |||||
this.установитьAce(); | |||||
this.улавливатьЗавершениеРедактирования(); | |||||
this.пз = new ПараметрыЗапуска(); | |||||
this.задатьКодПриЗапуске(); | |||||
события.подписать(this); | |||||
}; | |||||
this.задатьКодПриЗапуске = function() | |||||
{ | |||||
var z64 = this.пз.параметры["z64"]; | |||||
if (z64) | |||||
{ | |||||
var код = изZ64(z64); | |||||
this.ace.session.setValue(код); | |||||
} | |||||
}; | |||||
this.исполнитьКод = function() | |||||
{ | |||||
var содержимое = this.ace.session.getValue(); | |||||
var z64 = вZ64(содержимое); | |||||
var путь = window.location.pathname + "?z64=" + z64; | |||||
history.pushState(null, "", путь); | |||||
var воспроизведение = document.getElementById("воспроизведение"); | |||||
var адрес = "../проигрыватель/index.html?z64=" + z64; | |||||
воспроизведение.src = адрес; | |||||
}; | |||||
this.обработатьСобытие = function(событие) | |||||
{ | |||||
if (событие == "завершили редактирование") | |||||
{ | |||||
this.проверитьКорректностьКода(); | |||||
} | |||||
else if (событие == "код корректен") | |||||
{ | |||||
this.исполнитьКод(); | |||||
} | |||||
}; | |||||
this.установитьAce = function() | |||||
{ | |||||
var область = document.getElementById(имяРедактора); | |||||
this.ace = window.ace.edit(имяРедактора); | |||||
this.ace.session.setMode("ace/mode/javascript"); | |||||
this.ace.session.setUseWrapMode(true); | |||||
} | |||||
this.улавливатьЗавершениеРедактирования = function() | |||||
{ | |||||
var тут = this; | |||||
this.ace.session.on("change", function(дельта) { | |||||
const билет = uuid(); | |||||
тут.билет = билет; | |||||
setTimeout( | |||||
function() | |||||
{ | |||||
if (билет == тут.билет) | |||||
{ | |||||
события.уведомить("завершили редактирование"); | |||||
} | |||||
}, | |||||
1000 | |||||
); | |||||
}); | |||||
}; | |||||
this.проверитьКорректностьКода = function() | |||||
{ | |||||
try | |||||
{ | |||||
eval(this.ace.session.getValue()); | |||||
события.уведомить("код корректен"); | |||||
} | |||||
catch (ошибка) | |||||
{ | |||||
события.уведомить("код некорректен"); | |||||
} | |||||
}; | |||||
// Конструктор. | |||||
this.создать(); | |||||
} |
@@ -1,20 +1,20 @@ | |||||
function Редактор(события, имяОбласти) | |||||
function Редактор(события, имяРедактора, имяВоспроизведения) | |||||
{ | { | ||||
this.создать = function() | this.создать = function() | ||||
{ | { | ||||
this.установитьAce(); | this.установитьAce(); | ||||
this.улавливатьЗавершениеРедактирования(); | this.улавливатьЗавершениеРедактирования(); | ||||
this.разобратьПараметрыЗапуска(); | |||||
this.пз = new ПараметрыЗапуска(); | |||||
this.задатьКодПриЗапуске(); | this.задатьКодПриЗапуске(); | ||||
события.подписать(this); | события.подписать(this); | ||||
}; | }; | ||||
this.задатьКодПриЗапуске = function() | this.задатьКодПриЗапуске = function() | ||||
{ | { | ||||
var z64 = this.параметрыЗапуска["z64"]; | |||||
var z64 = this.пз.параметры["z64"]; | |||||
if (z64) | if (z64) | ||||
{ | { | ||||
var код = this.изZ64(z64); | |||||
var код = изZ64(z64); | |||||
this.ace.session.setValue(код); | this.ace.session.setValue(код); | ||||
} | } | ||||
}; | }; | ||||
@@ -22,9 +22,13 @@ function Редактор(события, имяОбласти) | |||||
this.исполнитьКод = function() | this.исполнитьКод = function() | ||||
{ | { | ||||
var содержимое = this.ace.session.getValue(); | var содержимое = this.ace.session.getValue(); | ||||
var z64 = this.вZ64(содержимое); | |||||
var z64 = вZ64(содержимое); | |||||
var путь = window.location.pathname + "?z64=" + z64; | var путь = window.location.pathname + "?z64=" + z64; | ||||
history.pushState(null, "", путь); | history.pushState(null, "", путь); | ||||
var воспроизведение = document.getElementById("воспроизведение"); | |||||
var адрес = "../проигрыватель/index.html?z64=" + z64; | |||||
воспроизведение.src = адрес; | |||||
}; | }; | ||||
this.обработатьСобытие = function(событие) | this.обработатьСобытие = function(событие) | ||||
@@ -39,37 +43,11 @@ function Редактор(события, имяОбласти) | |||||
} | } | ||||
}; | }; | ||||
this.разобратьПараметрыЗапуска = function() | |||||
{ | |||||
this.параметрыЗапуска = {}; | |||||
var запрос = window.location.search.substring(1); | |||||
var аргументы = запрос.split("&"); | |||||
for (var номер in аргументы) | |||||
{ | |||||
var арг = аргументы[номер]; | |||||
var позицияЗнака = арг.indexOf("="); | |||||
// Лишь ключ. | |||||
if (позицияЗнака == -1) | |||||
{ | |||||
var ключ = decodeURIComponent(арг); | |||||
this.параметрыЗапуска[ключ] = null; | |||||
} | |||||
// Ключ со значением. | |||||
else | |||||
{ | |||||
var сыройКлюч = арг.slice(0, позицияЗнака); | |||||
var сыроеЗначение = арг.slice(позицияЗнака + 1); | |||||
var ключ = decodeURIComponent(сыройКлюч); | |||||
var значение = decodeURIComponent(сыроеЗначение); | |||||
this.параметрыЗапуска[ключ] = значение; | |||||
} | |||||
} | |||||
}; | |||||
this.установитьAce = function() | this.установитьAce = function() | ||||
{ | { | ||||
var область = document.getElementById(имяОбласти); | |||||
this.ace = window.ace.edit(имяОбласти); | |||||
var область = document.getElementById(имяРедактора); | |||||
this.ace = window.ace.edit(имяРедактора); | |||||
this.ace.session.setMode("ace/mode/javascript"); | this.ace.session.setMode("ace/mode/javascript"); | ||||
this.ace.session.setUseWrapMode(true); | this.ace.session.setUseWrapMode(true); | ||||
} | } | ||||
@@ -78,7 +56,7 @@ function Редактор(события, имяОбласти) | |||||
{ | { | ||||
var тут = this; | var тут = this; | ||||
this.ace.session.on("change", function(дельта) { | this.ace.session.on("change", function(дельта) { | ||||
const билет = тут.uuid(); | |||||
const билет = uuid(); | |||||
тут.билет = билет; | тут.билет = билет; | ||||
setTimeout( | setTimeout( | ||||
function() | function() | ||||
@@ -106,33 +84,6 @@ function Редактор(события, имяОбласти) | |||||
} | } | ||||
}; | }; | ||||
this.вZ64 = function(строка) | |||||
{ | |||||
var байты = new TextEncoder("utf-8").encode(строка); | |||||
var архив = pako.deflate(байты, { to: 'string' }); | |||||
return base64js.fromByteArray(архив); | |||||
}; | |||||
this.изZ64 = function(строка) | |||||
{ | |||||
var архив = base64js.toByteArray(строка); | |||||
var байты = pako.inflate(архив); | |||||
return new TextDecoder("utf-8").decode(байты); | |||||
}; | |||||
this.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); | |||||
} | |||||
); | |||||
}; | |||||
// Конструктор. | // Конструктор. | ||||
this.создать(); | this.создать(); | ||||
} | } |
@@ -0,0 +1,35 @@ | |||||
function Пульт(события, имяОшибки, имяПуска) | |||||
{ | |||||
this.создать = function() | |||||
{ | |||||
var ошибка = document.getElementById(имяОшибки); | |||||
var пуск = document.getElementById(имяПуска); | |||||
пуск.addEventListener("click", function(событие) { | |||||
/**/console.debug("НАДО запустить"); | |||||
}); | |||||
события.подписать(this); | |||||
}; | |||||
this.обработатьСобытие = function(событие) | |||||
{ | |||||
if (событие == "код корректен") | |||||
{ | |||||
this.показатьОшибку(false); | |||||
} | |||||
else if (событие == "код некорректен") | |||||
{ | |||||
this.показатьОшибку(true); | |||||
} | |||||
}; | |||||
this.показатьОшибку = function(показать) | |||||
{ | |||||
ошибка.innerHTML = показать ? "⚠" : " "; | |||||
}; | |||||
// Конструктор. | |||||
this.создать(); | |||||
} |
@@ -0,0 +1,12 @@ | |||||
function Муром() | |||||
{ | |||||
this.создать = function() | |||||
{ | |||||
this.события = new События(); | |||||
this.редактор = new Редактор(this.события, "редактор"); | |||||
this.пульт = new Пульт(this.события, "ошибка", "пуск"); | |||||
}; | |||||
// Конструктор. | |||||
this.создать(); | |||||
} |
@@ -40,9 +40,9 @@ | |||||
top: 0; | top: 0; | ||||
bottom: 0; | bottom: 0; | ||||
width: calc(50% - 2em); | width: calc(50% - 2em); | ||||
border: 0px none; | |||||
} | } | ||||
</style> | |||||
<style> | |||||
.впульте | .впульте | ||||
{ | { | ||||
margin: 0 auto; | margin: 0 auto; | ||||
@@ -55,12 +55,14 @@ | |||||
<span id="ошибка" class="впульте"> </span> | <span id="ошибка" class="впульте"> </span> | ||||
<a id="пуск" class="впульте uk-icon-button uk-margin-top" uk-icon="play" uk-tooltip="Пуск"></a> | <a id="пуск" class="впульте uk-icon-button uk-margin-top" uk-icon="play" uk-tooltip="Пуск"></a> | ||||
</div> | </div> | ||||
<div id="воспроизведение"></div> | |||||
<iframe id="воспроизведение"></iframe> | |||||
<script src="../общее/100.события.js"></script> | |||||
<script src="100.редактор.js"></script> | |||||
<script src="200.пульт.js"></script> | |||||
<script src="700.муром.js"></script> | |||||
<script src="../общее/100.События.js"></script> | |||||
<script src="../общее/200.функции.js"></script> | |||||
<script src="../общее/300.ПараметрыЗапуска.js"></script> | |||||
<script src="100.Редактор.js"></script> | |||||
<script src="200.Пульт.js"></script> | |||||
<script src="700.Муром.js"></script> | |||||
<script> | <script> | ||||
var муром = new Муром(); | var муром = new Муром(); | ||||
</script> | </script> | ||||