@@ -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.события = 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"/> | |||
<script src="../общее/base64-js/base64js.min.js"></script> | |||
<script src="../общее/pako/pako.min.js"></script> | |||
<script src="matter-js/matter.min.js"></script> | |||
<style> | |||
</style> | |||
</head> | |||
@@ -12,8 +13,10 @@ | |||
<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> | |||
var игра = new Игра(); | |||
</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.установитьAce(); | |||
this.улавливатьЗавершениеРедактирования(); | |||
this.разобратьПараметрыЗапуска(); | |||
this.пз = new ПараметрыЗапуска(); | |||
this.задатьКодПриЗапуске(); | |||
события.подписать(this); | |||
}; | |||
this.задатьКодПриЗапуске = function() | |||
{ | |||
var z64 = this.параметрыЗапуска["z64"]; | |||
var z64 = this.пз.параметры["z64"]; | |||
if (z64) | |||
{ | |||
var код = this.изZ64(z64); | |||
var код = изZ64(z64); | |||
this.ace.session.setValue(код); | |||
} | |||
}; | |||
@@ -22,9 +22,13 @@ function Редактор(события, имяОбласти) | |||
this.исполнитьКод = function() | |||
{ | |||
var содержимое = this.ace.session.getValue(); | |||
var z64 = this.вZ64(содержимое); | |||
var z64 = вZ64(содержимое); | |||
var путь = window.location.pathname + "?z64=" + z64; | |||
history.pushState(null, "", путь); | |||
var воспроизведение = document.getElementById("воспроизведение"); | |||
var адрес = "../проигрыватель/index.html?z64=" + z64; | |||
воспроизведение.src = адрес; | |||
}; | |||
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() | |||
{ | |||
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.setUseWrapMode(true); | |||
} | |||
@@ -78,7 +56,7 @@ function Редактор(события, имяОбласти) | |||
{ | |||
var тут = this; | |||
this.ace.session.on("change", function(дельта) { | |||
const билет = тут.uuid(); | |||
const билет = uuid(); | |||
тут.билет = билет; | |||
setTimeout( | |||
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.создать(); | |||
} |
@@ -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; | |||
bottom: 0; | |||
width: calc(50% - 2em); | |||
border: 0px none; | |||
} | |||
</style> | |||
<style> | |||
.впульте | |||
{ | |||
margin: 0 auto; | |||
@@ -55,12 +55,14 @@ | |||
<span id="ошибка" class="впульте"> </span> | |||
<a id="пуск" class="впульте uk-icon-button uk-margin-top" uk-icon="play" uk-tooltip="Пуск"></a> | |||
</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> | |||
var муром = new Муром(); | |||
</script> | |||