Browse Source

проигрыватель

tags/4.1
parent
commit
18213f4df0
13 changed files with 291 additions and 70 deletions
  1. +31
    -0
      3.0/общее/100.События.js
  2. +26
    -0
      3.0/общее/200.функции.js
  3. +31
    -0
      3.0/общее/300.ПараметрыЗапуска.js
  4. +22
    -0
      3.0/проигрыватель/700.Игра.js
  5. +12
    -0
      3.0/проигрыватель/700.игра.js
  6. +5
    -2
      3.0/проигрыватель/index.html
  7. +1
    -0
      3.0/проигрыватель/matter-js/README.md
  8. +6
    -0
      3.0/проигрыватель/matter-js/matter.min.js
  9. +89
    -0
      3.0/редактор/100.Редактор.js
  10. +12
    -61
      3.0/редактор/100.редактор.js
  11. +35
    -0
      3.0/редактор/200.Пульт.js
  12. +12
    -0
      3.0/редактор/700.Муром.js
  13. +9
    -7
      3.0/редактор/index.html

+ 31
- 0
3.0/общее/100.События.js View 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
- 0
3.0/общее/200.функции.js View 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
- 0
3.0/общее/300.ПараметрыЗапуска.js View 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
- 0
3.0/проигрыватель/700.Игра.js View 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.создать();
}

+ 12
- 0
3.0/проигрыватель/700.игра.js View File

@@ -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("Игра.исполнитьКод:", код);
}
}; };


// Конструктор. // Конструктор.


+ 5
- 2
3.0/проигрыватель/index.html View File

@@ -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>


+ 1
- 0
3.0/проигрыватель/matter-js/README.md View File

@@ -0,0 +1 @@
https://github.com/liabru/matter-js/blob/master/build/matter.min.js

+ 6
- 0
3.0/проигрыватель/matter-js/matter.min.js
File diff suppressed because it is too large
View File


+ 89
- 0
3.0/редактор/100.Редактор.js View 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.создать();
}

+ 12
- 61
3.0/редактор/100.редактор.js View File

@@ -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.создать();
} }

+ 35
- 0
3.0/редактор/200.Пульт.js View 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 = показать ? "⚠" : "&nbsp;";
};

// Конструктор.
this.создать();
}

+ 12
- 0
3.0/редактор/700.Муром.js View File

@@ -0,0 +1,12 @@
function Муром()
{
this.создать = function()
{
this.события = new События();
this.редактор = new Редактор(this.события, "редактор");
this.пульт = new Пульт(this.события, "ошибка", "пуск");
};

// Конструктор.
this.создать();
}

+ 9
- 7
3.0/редактор/index.html View File

@@ -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="впульте">&nbsp;</span> <span id="ошибка" class="впульте">&nbsp;</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>


Loading…
Cancel
Save