@@ -1,16 +1,15 @@ | |||||
МАОН | МАОН | ||||
0.2.5 | |||||
0.2.6 | |||||
https://git.opengamestudio.org/KH/MAOH | https://git.opengamestudio.org/KH/MAOH | ||||
x /⨐.js | |||||
x /🎬.js | x /🎬.js | ||||
/🎬.череда | /🎬.череда | ||||
/🏁.js | /🏁.js | ||||
/🏁.череда | /🏁.череда | ||||
/📦 | /📦 | ||||
x /📦.js | |||||
/📦.череда | |||||
x /🔄.js | x /🔄.js | ||||
/🔄.череда | /🔄.череда | ||||
/🙈.css | /🙈.css | ||||
/🙈.html | |||||
x /🙈.js | |||||
x /🧱.js | |||||
/🙈.html |
@@ -1,33 +0,0 @@ | |||||
function сделатьПараллельно(мир, список, функция, откликУспех, откликПровал = null) | |||||
{ | |||||
for (const номер in список) | |||||
{ | |||||
функция(мир, список, номер, готово, провал); | |||||
} | |||||
var всего = 0; | |||||
function готово() | |||||
{ | |||||
всего += 1; | |||||
if (всего == список.length) | |||||
{ | |||||
откликУспех(); | |||||
} | |||||
} | |||||
var провалУжеСообщили = false; | |||||
function провал() | |||||
{ | |||||
if (провалУжеСообщили) | |||||
{ | |||||
return; | |||||
} | |||||
провалУжеСообщили = true; | |||||
if (откликПровал) | |||||
{ | |||||
откликПровал(); | |||||
} | |||||
} | |||||
} |
@@ -1,40 +1,26 @@ | |||||
// // // // | |||||
ОкончитьЗагрузкуМаджонга = мир => | |||||
ЗадатьЗаголовок = мир => | |||||
{ | { | ||||
мир.уведомить("надо окончить загрузку маджонга"); | |||||
document.title = "🀄 МАОН"; | |||||
}; | }; | ||||
// // // // | // // // // | ||||
ЗагрузитьЧередуОкончания = мир => | |||||
ОтобразитьСтраницуЗагрузки = мир => | |||||
{ | { | ||||
var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | ||||
var содержимое = м.содержимое["/🏁.js"]; | |||||
eval(содержимое); | |||||
м.исполнитьЧереду(мир, "/🏁.череда"); | |||||
}; | |||||
// // // // | |||||
ПроверитьНаличиеОбновленийПриложения = мир => | |||||
{ | |||||
// Эта функция находится вне "/🔄.js", т.к. "/🔄.js" отключаем, | |||||
// отчего этой функции просто не будет в пространстве имён. | |||||
var событие = "надо обновить приложение при наличии обновлений"; | |||||
if (событие in мир.события) | |||||
{ | |||||
мир.уведомить(событие); | |||||
} | |||||
else | |||||
{ | |||||
мир.уведомить("обновления приложения отсутствуют"); | |||||
} | |||||
var вид = document.createElement("style"); | |||||
document.head.appendChild(вид); | |||||
вид.innerHTML = м.содержимое["/🙈.css"]; | |||||
var структура = м.содержимое["/🙈.html"] | |||||
.replace(/\${версия}/g, м.версия); | |||||
// Вставляем содержимое в рамку, чтобы применяемые стили UIkit не | |||||
// дёргали надписи. | |||||
// https://stackoverflow.com/a/8322025 | |||||
var рамка = "<iframe id='экран-загрузки' class='фон-экрана' frameBorder='0'></iframe>"; | |||||
document.body.insertAdjacentHTML("afterbegin", рамка); | |||||
document.getElementById("экран-загрузки").src = "data:text/html;charset=utf-8," + структура; | |||||
}; | }; |
@@ -1,9 +1,3 @@ | |||||
пуск | пуск | ||||
задать заголовок | задать заголовок | ||||
отобразить страницу загрузки маджонга | |||||
проверить наличие обновлений приложения | |||||
обновления приложения отсутствуют | |||||
загрузить библиотеки приложения | |||||
загрузили библиотеки приложения | |||||
загрузить череду окончания | |||||
окончить загрузку маджонга | |||||
отобразить страницу загрузки |
@@ -1,9 +1,206 @@ | |||||
const РЕСУРСЫ = "https://git.opengamestudio.org/PuCOBATEJlb/PECYPCbl/raw/branch/master/0000"; | |||||
const ФИШКА = "/фишка.gltf"; | |||||
const ТЕМА_ОТЛАДОЧНАЯ = "https://git.opengamestudio.org/MAOH/MAOH_TEMA_OTAK/raw/branch/master/0000"; | |||||
// // // // | |||||
СкрытьУбранныеФишки = мир => | |||||
{ | |||||
for (var номер in мир.убранныеФишкиМаджонга) | |||||
{ | |||||
var н = мир.убранныеФишкиМаджонга[номер]; | |||||
// Перемещаем фишку на другой слой для исключения её из отрисовки и выбора. | |||||
var ф = мир.фишки[н]; | |||||
ф.layers.set(1); | |||||
} | |||||
} | |||||
// // // // | |||||
ЗадатьФишкуДляВыбора = мир => | |||||
{ | |||||
var номер = мир.выбранныйУзел.userData; | |||||
мир.фишкаМаджонгаДляВыбора = номер; | |||||
} | |||||
// // // // | |||||
ПодготовитьФишкиКВыбору = мир => | |||||
{ | |||||
мир.выборныеУзлы = мир.фишки; | |||||
мир.задержкаОтображенияВыбранныхФишек = 0; | |||||
}; | |||||
// // // // | |||||
ВыделитьВыбранныеФишки = мир => | |||||
{ | |||||
for (var номер in мир.выбранныеФишкиМаджонга) | |||||
{ | |||||
var н = мир.выбранныеФишкиМаджонга[номер]; | |||||
var ф = мир.фишки[н]; | |||||
var г = мир.фишкиМаджонга[н]["🚩"]; | |||||
var м = мир.выбранныеМатериалы[г]; | |||||
ф.material = м; | |||||
} | |||||
}; | |||||
// // // // | |||||
ЗадатьМатериалыФишкам = мир => | |||||
{ | |||||
for (var н in мир.фишки) | |||||
{ | |||||
var ф = мир.фишки[н]; | |||||
var г = мир.фишкиМаджонга[н]["🚩"]; | |||||
var м = мир.материалы[г]; | |||||
ф.material = м; | |||||
} | |||||
}; | |||||
// // // // | |||||
СоздатьФишки = мир => | |||||
{ | |||||
var фишка = мир.полигональныеСетки[РЕСУРСЫ][ФИШКА]; | |||||
var границы = фишка.geometry.boundingBox; | |||||
var размеры = [ | |||||
(границы.max.x - границы.min.x) / 2, | |||||
(границы.max.z - границы.min.z) / 2, | |||||
//границы.max.y - границы.min.y, | |||||
]; | |||||
var отступ = 0.02; | |||||
мир.фишки = []; | |||||
for (var номер in мир.фишкиМаджонга) | |||||
{ | |||||
// Узел сцены. | |||||
var фм = мир.фишкиМаджонга[номер]; | |||||
var ф = фишка.clone(); | |||||
ф.userData = номер; | |||||
мир.фишки.push(ф); | |||||
мир.сцена.add(ф); | |||||
// Расположение. | |||||
var позиция = фм["📍"]; | |||||
/* | |||||
var слой = позиция[0]; | |||||
var ряд = позиция[1]; | |||||
var столбец = позиция[2]; | |||||
*/ | |||||
var слой = 0; | |||||
var ряд = позиция[0]; | |||||
var столбец = позиция[1]; | |||||
ф.position.x = столбец * (размеры[0] + отступ); | |||||
ф.position.z = ряд * (размеры[1] + отступ); | |||||
ф.position.y = слой; | |||||
} | |||||
}; | |||||
// // // // | |||||
ЗадатьФишки = мир => | |||||
{ | |||||
мир.фишкиМаджонга = [ | |||||
{ | |||||
"📍": [0, 0], | |||||
"🚩": 0, | |||||
}, | |||||
{ | |||||
"📍": [2, 0], | |||||
"🚩": 0, | |||||
}, | |||||
{ | |||||
"📍": [0, 2], | |||||
"🚩": 1, | |||||
}, | |||||
]; | |||||
}; | |||||
// // // // | |||||
СоздатьПримерСцены = мир => | |||||
{ | |||||
мир.сцена.background = new THREE.Color(0xFFFFFF); | |||||
мир.камера.position.y = 10; | |||||
мир.камера.position.z = 5; | |||||
мир.камера.lookAt(new THREE.Vector3(0, 0, 0)); | |||||
мир.свет = new THREE.DirectionalLight(0xFFFFFF, 1); | |||||
мир.свет.position.set(-0.5, 1, 0.5).normalize(); | |||||
мир.сцена.add(мир.свет); | |||||
}; | |||||
// // // // | |||||
СоздатьМатериалыФишек = мир => | |||||
{ | |||||
мир.материалы = []; | |||||
мир.выбранныеМатериалы = []; | |||||
var текстуры = мир.текстуры[ТЕМА_ОТЛАДОЧНАЯ]; | |||||
for (var имя in текстуры) | |||||
{ | |||||
var текстура = текстуры[имя]; | |||||
var материал = new THREE.MeshLambertMaterial({ | |||||
map: текстура, | |||||
color: new THREE.Color(0xAAAAAA), | |||||
}); | |||||
мир.материалы.push(материал); | |||||
var выбранныйМатериал = new THREE.MeshLambertMaterial({ | |||||
map: текстура, | |||||
color: new THREE.Color(0xFFFFFF), | |||||
}); | |||||
мир.выбранныеМатериалы.push(выбранныйМатериал); | |||||
} | |||||
}; | |||||
// // // // | |||||
ПодготовитьсяКЗагрузкеРесурсов = мир => | |||||
{ | |||||
мир.полигональныеСетки = { | |||||
[РЕСУРСЫ]: { | |||||
[ФИШКА]: null, | |||||
}, | |||||
}; | |||||
мир.текстуры = { | |||||
[ТЕМА_ОТЛАДОЧНАЯ]: { }, | |||||
}; | |||||
var м = мир.модули.модульПоУказателю(ТЕМА_ОТЛАДОЧНАЯ); | |||||
var файлы = Object.keys(м.структура).sort(); | |||||
for (var номер in файлы) | |||||
{ | |||||
var файл = файлы[номер]; | |||||
мир.текстуры[ТЕМА_ОТЛАДОЧНАЯ][файл] = null; | |||||
} | |||||
}; | |||||
// // // // | // // // // | ||||
ПлавноУбратьСтраницуЗагрузкиМаджонгаИСкрытьКрутилку = мир => | |||||
ПлавноУбратьСтраницуЗагрузкиИСкрытьКрутилку = мир => | |||||
{ | { | ||||
плавноСкрытьИУдалить("экран-загрузки", { "задержка": 0.4 }); | плавноСкрытьИУдалить("экран-загрузки", { "задержка": 0.4 }); | ||||
плавноСкрыть("крутилка", { "задержка": 0.4 }); | плавноСкрыть("крутилка", { "задержка": 0.4 }); |
@@ -1,2 +1,25 @@ | |||||
надо окончить загрузку маджонга | |||||
плавно убрать страницу загрузки маджонга и скрыть крутилку | |||||
надо окончить загрузку приложения | |||||
плавно убрать страницу загрузки и скрыть крутилку | |||||
подготовиться к загрузке ресурсов | |||||
загрузить полигональные сетки | |||||
загрузили полигональные сетки | |||||
загрузить текстуры | |||||
загрузили текстуры | |||||
создать материалы фишек | |||||
создать пример сцены | |||||
подготовить механику маджонга | |||||
задать фишки | |||||
создать фишки | |||||
задать материалы фишкам | |||||
подготовить фишки к выбору | |||||
нажатие в рисователе | |||||
выбрать узел сцены | |||||
выбрали узел сцены | |||||
задать фишку для выбора | |||||
выбрать фишку маджонга | |||||
изменили выбранные фишки маджонга | |||||
задать материалы фишкам | |||||
выделить выбранные фишки | |||||
убрали фишки маджонга | |||||
скрыть убранные фишки |
@@ -4,7 +4,9 @@ | |||||
https://bitbucket.org/gitjs/jquery/raw/3.5.1/0000 | https://bitbucket.org/gitjs/jquery/raw/3.5.1/0000 | ||||
https://bitbucket.org/gitjs/uikit/raw/3.2.0/0000 | https://bitbucket.org/gitjs/uikit/raw/3.2.0/0000 | ||||
https://git.opengamestudio.org/mahjong/base64/raw/branch/master/0000 | |||||
https://git.opengamestudio.org/mahjong/mahjong-raskladka-layout/raw/branch/master/0000 | https://git.opengamestudio.org/mahjong/mahjong-raskladka-layout/raw/branch/master/0000 | ||||
https://git.opengamestudio.org/mahjong/povtorniy-repeating-ui/raw/branch/master/0000 | https://git.opengamestudio.org/mahjong/povtorniy-repeating-ui/raw/branch/master/0000 | ||||
https://git.opengamestudio.org/KH/PuCOBATEJlb-renderer/raw/branch/master/0000 | |||||
https://git.opengamestudio.org/PuCOBATEJlb/PuCOBATEJlb/raw/branch/master/0000 | |||||
https://git.opengamestudio.org/PuCOBATEJlb/PECYPCbl/raw/branch/master/0000 | |||||
https://git.opengamestudio.org/MAOH/MAOH_TEMA_OTAK/raw/branch/master/0000 | |||||
https://git.opengamestudio.org/MAOH/MEXMA/raw/branch/master/0000 |
@@ -0,0 +1,69 @@ | |||||
ОкончитьЗагрузкуПриложения = мир => | |||||
{ | |||||
мир.уведомить("надо окончить загрузку приложения"); | |||||
}; | |||||
// // // // | |||||
ЗагрузитьОкончание = мир => | |||||
{ | |||||
var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | |||||
eval(м.содержимое["/🏁.js"]); | |||||
мир.разобрать(м.содержимое["/🏁.череда"]); | |||||
}; | |||||
// // // // | |||||
ЗагрузитьБиблиотекиПриложения = мир => | |||||
{ | |||||
var указатели = []; | |||||
var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | |||||
var содержимое = м.содержимое["/📦"]; | |||||
var строки = содержимое.split(/\n/); | |||||
for (var номер in строки) | |||||
{ | |||||
var строка = строки[номер]; | |||||
if (!строка.startsWith("#") && строка.length) | |||||
{ | |||||
указатели.push(строка); | |||||
} | |||||
} | |||||
if (указатели.length) | |||||
{ | |||||
var сообщение = "Загрузка библиотек ⚬ 加载库 ⚬ Loading libraries"; | |||||
console.debug(сообщение, указатели); | |||||
мир.модули.использовали.подписатьРаз(function() { | |||||
мир.уведомить("ручной пуск"); | |||||
мир.уведомить("загрузили библиотеки приложения"); | |||||
}); | |||||
мир.модули.использовать(указатели); | |||||
} | |||||
else | |||||
{ | |||||
мир.уведомить("загрузили библиотеки приложения"); | |||||
} | |||||
}; | |||||
// // // // | |||||
ПроверитьНаличиеОбновленийПриложения = мир => | |||||
{ | |||||
// Эта функция находится вне "/🔄.js", т.к. "/🔄.js" отключаем, | |||||
// отчего этой функции просто не будет в пространстве имён. | |||||
var событие = "надо обновить приложение при наличии обновлений"; | |||||
if (событие in мир.события) | |||||
{ | |||||
мир.уведомить(событие); | |||||
} | |||||
else | |||||
{ | |||||
мир.уведомить("обновления приложения отсутствуют"); | |||||
} | |||||
}; |
@@ -0,0 +1,7 @@ | |||||
пуск | |||||
проверить наличие обновлений приложения | |||||
обновления приложения отсутствуют | |||||
загрузить библиотеки приложения | |||||
загрузили библиотеки приложения | |||||
загрузить окончание | |||||
окончить загрузку приложения |
@@ -1,8 +1,3 @@ | |||||
// // // // | |||||
ПерезагрузитьПриложениеПослеОбновления = мир => | ПерезагрузитьПриложениеПослеОбновления = мир => | ||||
{ | { | ||||
window.location.reload(false); | window.location.reload(false); | ||||
@@ -1,31 +0,0 @@ | |||||
// // // // | |||||
ЗадатьЗаголовок = мир => | |||||
{ | |||||
document.title = "🀄 МАОН"; | |||||
}; | |||||
// // // // | |||||
ОтобразитьСтраницуЗагрузкиМаджонга = мир => | |||||
{ | |||||
var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | |||||
var вид = document.createElement("style"); | |||||
document.head.appendChild(вид); | |||||
вид.innerHTML = м.содержимое["/🙈.css"]; | |||||
var структура = м.содержимое["/🙈.html"] | |||||
.replace(/\${версия}/g, м.версия); | |||||
// Вставляем содержимое в рамку, чтобы применяемые стили UIkit не | |||||
// дёргали надписи. | |||||
// https://stackoverflow.com/a/8322025 | |||||
var рамка = "<iframe id='экран-загрузки' class='фон-экрана' frameBorder='0'></iframe>"; | |||||
document.body.insertAdjacentHTML("afterbegin", рамка); | |||||
document.getElementById("экран-загрузки").src = "data:text/html;charset=utf-8," + структура; | |||||
}; |
@@ -1,24 +0,0 @@ | |||||
ЗагрузитьБиблиотекиПриложения = мир => | |||||
{ | |||||
var указатели = []; | |||||
var м = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_ЭТОГО_МОДУЛЯ); | |||||
var содержимое = м.содержимое["/📦"]; | |||||
var строки = содержимое.split(/\n/); | |||||
for (var номер in строки) | |||||
{ | |||||
var строка = строки[номер]; | |||||
if (!строка.startsWith("#") && строка.length) | |||||
{ | |||||
указатели.push(строка); | |||||
} | |||||
} | |||||
var сообщение = "Загрузка библиотек ⚬ 加载库 ⚬ Loading libraries"; | |||||
console.debug(сообщение, указатели); | |||||
мир.модули.использовали.подписатьРаз(function() { | |||||
мир.уведомить("ручной пуск"); | |||||
мир.уведомить("загрузили библиотеки приложения"); | |||||
}); | |||||
мир.модули.использовать(указатели); | |||||
}; |