проигрыватель
This commit is contained in:
31
3.0/общее/100.События.js
Normal file
31
3.0/общее/100.События.js
Normal file
@@ -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.создать();
|
||||
}
|
||||
26
3.0/общее/200.функции.js
Normal file
26
3.0/общее/200.функции.js
Normal file
@@ -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);
|
||||
}
|
||||
);
|
||||
}
|
||||
31
3.0/общее/300.ПараметрыЗапуска.js
Normal file
31
3.0/общее/300.ПараметрыЗапуска.js
Normal file
@@ -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.создать();
|
||||
}
|
||||
22
3.0/проигрыватель/700.Игра.js
Normal file
22
3.0/проигрыватель/700.Игра.js
Normal file
@@ -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>
|
||||
|
||||
1
3.0/проигрыватель/matter-js/README.md
Normal file
1
3.0/проигрыватель/matter-js/README.md
Normal file
@@ -0,0 +1 @@
|
||||
https://github.com/liabru/matter-js/blob/master/build/matter.min.js
|
||||
6
3.0/проигрыватель/matter-js/matter.min.js
vendored
Normal file
6
3.0/проигрыватель/matter-js/matter.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
89
3.0/редактор/100.Редактор.js
Normal file
89
3.0/редактор/100.Редактор.js
Normal file
@@ -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.создать();
|
||||
}
|
||||
|
||||
35
3.0/редактор/200.Пульт.js
Normal file
35
3.0/редактор/200.Пульт.js
Normal file
@@ -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.создать();
|
||||
}
|
||||
12
3.0/редактор/700.Муром.js
Normal file
12
3.0/редактор/700.Муром.js
Normal file
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user