@@ -1,16 +1,15 @@ | |||
МАОН | |||
0.2.5 | |||
0.2.6 | |||
https://git.opengamestudio.org/KH/MAOH | |||
x /⨐.js | |||
x /🎬.js | |||
/🎬.череда | |||
/🏁.js | |||
/🏁.череда | |||
/📦 | |||
x /📦.js | |||
/📦.череда | |||
x /🔄.js | |||
/🔄.череда | |||
/🙈.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 содержимое = м.содержимое["/🏁.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 }); |
@@ -1,2 +1,25 @@ | |||
надо окончить загрузку маджонга | |||
плавно убрать страницу загрузки маджонга и скрыть крутилку | |||
надо окончить загрузку приложения | |||
плавно убрать страницу загрузки и скрыть крутилку | |||
подготовиться к загрузке ресурсов | |||
загрузить полигональные сетки | |||
загрузили полигональные сетки | |||
загрузить текстуры | |||
загрузили текстуры | |||
создать материалы фишек | |||
создать пример сцены | |||
подготовить механику маджонга | |||
задать фишки | |||
создать фишки | |||
задать материалы фишкам | |||
подготовить фишки к выбору | |||
нажатие в рисователе | |||
выбрать узел сцены | |||
выбрали узел сцены | |||
задать фишку для выбора | |||
выбрать фишку маджонга | |||
изменили выбранные фишки маджонга | |||
задать материалы фишкам | |||
выделить выбранные фишки | |||
убрали фишки маджонга | |||
скрыть убранные фишки |
@@ -4,7 +4,9 @@ | |||
https://bitbucket.org/gitjs/jquery/raw/3.5.1/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/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); | |||
@@ -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() { | |||
мир.уведомить("ручной пуск"); | |||
мир.уведомить("загрузили библиотеки приложения"); | |||
}); | |||
мир.модули.использовать(указатели); | |||
}; |