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

This commit is contained in:
kornerr committed 2021-09-06 15:25:20 +03:00
1 parent 3344af5fca
commit 18213f4df0
13 files changed
+291 -70

No files matched your search

+31
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
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);
}
);
}
@@ -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("Игра.исполнитьКод:", код);
}
};
// Конструктор.
+5 -2
View File
@@ -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,6 @@
/*!
* matter-js 0.17.1 by @liabru
* http://brm.io/matter-js/
* License MIT
*/
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Matter",[],t):"object"==typeof exports?exports.Matter=t():e.Matter=t()}(this,(function(){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var o=t[i]={i:i,l:!1,exports:{}};return e[i].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(i,o,function(t){return e[t]}.bind(null,o));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=22)}([function(e,t){var n={};e.exports=n,function(){n._nextId=0,n._seed=0,n._nowStartTime=+new Date,n._warnedOnce={},n._decomp=null,n.extend=function(e,t){var i,o;"boolean"==typeof t?(i=2,o=t):(i=1,o=!0);for(var r=i;r<arguments.length;r++){var a=arguments[r];if(a)for(var s in a)o&&a[s]&&a[s].constructor===Object?e[s]&&e[s].constructor!==Object?e[s]=a[s]:(e[s]=e[s]||{},n.extend(e[s],o,a[s])):e[s]=a[s]}return e},n.clone=function(e,t){return n.extend({},t,e)},n.keys=function(e){if(Object.keys)return Object.keys(e);var t=[];for(var n in e)t.push(n);return t},n.values=function(e){var t=[];if(Object.keys){for(var n=Object.keys(e),i=0;i<n.length;i++)t.push(e[n[i]]);return t}for(var o in e)t.push(e[o]);return t},n.get=function(e,t,n,i){t=t.split(".").slice(n,i);for(var o=0;o<t.length;o+=1)e=e[t[o]];return e},n.set=function(e,t,i,o,r){var a=t.split(".").slice(o,r);return n.get(e,t,0,-1)[a[a.length-1]]=i,i},n.shuffle=function(e){for(var t=e.length-1;t>0;t--){var i=Math.floor(n.random()*(t+1)),o=e[t];e[t]=e[i],e[i]=o}return e},n.choose=function(e){return e[Math.floor(n.random()*e.length)]},n.isElement=function(e){return"undefined"!=typeof HTMLElement?e instanceof HTMLElement:!!(e&&e.nodeType&&e.nodeName)},n.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)},n.isFunction=function(e){return"function"==typeof e},n.isPlainObject=function(e){return"object"==typeof e&&e.constructor===Object},n.isString=function(e){return"[object String]"===toString.call(e)},n.clamp=function(e,t,n){return e<t?t:e>n?n:e},n.sign=function(e){return e<0?-1:1},n.now=function(){if("undefined"!=typeof window&&window.performance){if(window.performance.now)return window.performance.now();if(window.performance.webkitNow)return window.performance.webkitNow()}return Date.now?Date.now():new Date-n._nowStartTime},n.random=function(t,n){return n=void 0!==n?n:1,(t=void 0!==t?t:0)+e()*(n-t)};var e=function(){return n._seed=(9301*n._seed+49297)%233280,n._seed/233280};n.colorToNumber=function(e){return 3==(e=e.replace("#","")).length&&(e=e.charAt(0)+e.charAt(0)+e.charAt(1)+e.charAt(1)+e.charAt(2)+e.charAt(2)),parseInt(e,16)},n.logLevel=1,n.log=function(){console&&n.logLevel>0&&n.logLevel<=3&&console.log.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.info=function(){console&&n.logLevel>0&&n.logLevel<=2&&console.info.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.warn=function(){console&&n.logLevel>0&&n.logLevel<=3&&console.warn.apply(console,["matter-js:"].concat(Array.prototype.slice.call(arguments)))},n.warnOnce=function(){var e=Array.prototype.slice.call(arguments).join(" ");n._warnedOnce[e]||(n.warn(e),n._warnedOnce[e]=!0)},n.deprecated=function(e,t,i){e[t]=n.chain((function(){n.warnOnce("🔅 deprecated 🔅",i)}),e[t])},n.nextId=function(){return n._nextId++},n.indexOf=function(e,t){if(e.indexOf)return e.indexOf(t);for(var n=0;n<e.length;n++)if(e[n]===t)return n;return-1},n.map=function(e,t){if(e.map)return e.map(t);for(var n=[],i=0;i<e.length;i+=1)n.push(t(e[i]));return n},n.topologicalSort=function(e){var t=[],i=[],o=[];for(var r in e)i[r]||o[r]||n._topologicalSort(r,i,o,e,t);return t},n._topologicalSort=function(e,t,i,o,r){var a=o[e]||[];i[e]=!0;for(var s=0;s<a.length;s+=1){var l=a[s];i[l]||(t[l]||n._topologicalSort(l,t,i,o,r))}i[e]=!1,t[e]=!0,r.push(e)},n.chain=function(){for(var e=[],t=0;t<arguments.length;t+=1){var n=arguments[t];n._chained?e.push.apply(e,n._chained):e.push(n)}var i=function(){for(var t,n=new Array(arguments.length),i=0,o=arguments.length;i<o;i++)n[i]=arguments[i];for(i=0;i<e.length;i+=1){var r=e[i].apply(t,n);void 0!==r&&(t=r)}return t};return i._chained=e,i},n.chainPathBefore=function(e,t,i){return n.set(e,t,n.chain(i,n.get(e,t)))},n.chainPathAfter=function(e,t,i){return n.set(e,t,n.chain(n.get(e,t),i))},n.setDecomp=functLine truncated
@@ -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
View File
@@ -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
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
View File
@@ -0,0 +1,12 @@
function Муром()
{
this.создать = function()
{
this.события = new События();
this.редактор = new Редактор(this.события, "редактор");
this.пульт = new Пульт(this.события, "ошибка", "пуск");
};
// Конструктор.
this.создать();
}
+9 -7
View File
@@ -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="впульте">&nbsp;</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>