@@ -6,5 +6,7 @@ x /интерфейс|ui.js | |||||
/интерфейс|ui.череда | /интерфейс|ui.череда | ||||
x /пуск|run.js | x /пуск|run.js | ||||
/пуск|run.череда | /пуск|run.череда | ||||
x /раскладка|layout.js | |||||
/раскладка|layout.череда | |||||
x /сцена|scene.js | x /сцена|scene.js | ||||
/сцена|scene.череда | /сцена|scene.череда |
@@ -0,0 +1,155 @@ | |||||
// // // // | |||||
ВывестиПозицииРаскладкиKMahjongg = мир => | |||||
{ | |||||
console.debug("Позиции раскладки KMahjongg НАЧАЛО"); | |||||
const позиции = мир.раскладкаKMahjongg.позиции; | |||||
for (var номер in позиции) { | |||||
const позиция = позиции[номер]; | |||||
console.debug(позиция); | |||||
} | |||||
console.debug("Позиции раскладки KMahjongg КОНЕЦ"); | |||||
}; | |||||
// // // // | |||||
РазобратьПозицииЭлементовРаскладкиKMahjongg = мир => | |||||
{ | |||||
const параметры = мир.раскладкаKMahjongg.параметры; | |||||
const строки = мир.раскладкаKMahjongg.строки; | |||||
var позиции = []; | |||||
for (var номерСлоя = 0; номерСлоя < параметры.глубина; ++номерСлоя) | |||||
{ | |||||
console.debug("cлой", номерСлоя); | |||||
for (var ряд = 0; ряд < параметры.высота - 1; ++ряд) | |||||
{ | |||||
for (var столбец = 0; столбец < параметры.ширина - 1; ++столбец) | |||||
{ | |||||
const рядСлоя = ряд + (номерСлоя * параметры.высота); | |||||
if ( | |||||
(строки[рядСлоя][столбец] == '1') && | |||||
(строки[рядСлоя][столбец + 1] == '2') && | |||||
(строки[рядСлоя + 1][столбец] == '4') && | |||||
(строки[рядСлоя + 1][столбец + 1] == '3') | |||||
) { | |||||
позиции.push([номерСлоя, ряд, столбец]); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
мир.раскладкаKMahjongg.позиции = позиции; | |||||
}; | |||||
// // // // | |||||
ВывестиПараметрыРаскладкиKMahjongg = мир => | |||||
{ | |||||
console.debug("Параметры раскладки KMahjongg", JSON.stringify(мир.раскладкаKMahjongg.параметры)); | |||||
}; | |||||
// // // // | |||||
РазобратьПараметрыРаскладкиKMahjongg = мир => | |||||
{ | |||||
var параметры = { | |||||
"ширина": 32, | |||||
"высота": 16, | |||||
"глубина": 0, | |||||
"версия": "1.0", | |||||
}; | |||||
var префиксы = { | |||||
"версия": "kmahjongg-layout-v", | |||||
"глубина": "d", | |||||
"ширина": "w", | |||||
"высота": "h", | |||||
}; | |||||
var удалитьЭлементов = 0; | |||||
var строки = мир.раскладкаKMahjongg.строки; | |||||
for (var номер in строки) | |||||
{ | |||||
var строка = строки[номер]; | |||||
// Версия. | |||||
if (строка.startsWith(префиксы.версия)) | |||||
{ | |||||
параметры.версия = строка.substring(префиксы.версия.length); | |||||
} | |||||
// Глубина. | |||||
else if (строка.startsWith(префиксы.глубина)) | |||||
{ | |||||
параметры.глубина = строка.substring(префиксы.глубина.length); | |||||
} | |||||
// Ширина. | |||||
else if (строка.startsWith(префиксы.ширина)) | |||||
{ | |||||
параметры.ширина = строка.substring(префиксы.ширина.length); | |||||
} | |||||
// Высота. | |||||
else if (строка.startsWith(префиксы.высота)) | |||||
{ | |||||
параметры.высота = строка.substring(префиксы.высота.length); | |||||
} | |||||
else | |||||
{ | |||||
удалитьЭлементов = номер; | |||||
break; | |||||
} | |||||
} | |||||
мир.раскладкаKMahjongg.строки.splice(0, удалитьЭлементов); | |||||
if (параметры.глубина == 0) | |||||
{ | |||||
параметры.глубина = мир.раскладкаKMahjongg.строки.length / параметры.высота; | |||||
} | |||||
мир.раскладкаKMahjongg.параметры = параметры; | |||||
}; | |||||
// // // // | |||||
ПодготовитьРаскладкуKMahjonggКРазбору = мир => | |||||
{ | |||||
var строки = мир.раскладкаKMahjongg.содержимое.split(/\n/); | |||||
мир.раскладкаKMahjongg.строки = []; | |||||
for (var номер in строки) | |||||
{ | |||||
var строка = строки[номер].trim(); | |||||
// Пропускаем комментарии и пустые строки. | |||||
if (строка.startsWith("#") || !строка.length) | |||||
{ | |||||
continue; | |||||
} | |||||
мир.раскладкаKMahjongg.строки.push(строка); | |||||
} | |||||
}; | |||||
// // // // | |||||
УведомитьОбОкончанииРазбораРаскладкиKMahjongg = мир => | |||||
{ | |||||
мир.уведомить("разобрали раскладку KMahjongg"); | |||||
}; | |||||
// // // // | |||||
РазобратьРаскладкуKMahjongg = мир => | |||||
{ | |||||
мир.уведомить("надо разобрать раскладку KMahjongg"); | |||||
}; | |||||
@@ -0,0 +1,7 @@ | |||||
надо разобрать раскладку KMahjongg | |||||
подготовить раскладку KMahjongg к разбору | |||||
разобрать параметры раскладки KMahjongg | |||||
вывести параметры раскладки KMahjongg | |||||
разобрать позиции элементов раскладки KMahjongg | |||||
вывести позиции раскладки KMahjongg | |||||
уведомить об окончании разбора раскладки KMahjongg |
@@ -1,23 +1,59 @@ | |||||
const ИМЯ = "ОМ | MB"; | const ИМЯ = "ОМ | MB"; | ||||
const БАЗА = "https://git.opengamestudio.org/mahjong/mahjong-modeli-models/raw/branch/master/"; | |||||
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; | const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; | ||||
// // // // | // // // // | ||||
ВключитьКэшированиеРесурсовThreeJSДляЗагрузкиРесурсовИзМодулей = мир => | |||||
ЦентрироватьСцену = мир => | |||||
{ | { | ||||
THREE.Cache.enabled = true; | |||||
// мир.корень.position | |||||
}; | |||||
// // // // | |||||
ОтобразитьРаскладкуОднойФишкой = мир => | |||||
{ | |||||
var границы = мир.фишка.geometry.boundingBox; | |||||
var размеры = [ | |||||
(границы.max.x - границы.min.x) / 2, | |||||
(границы.max.z - границы.min.z) / 2, | |||||
границы.max.y - границы.min.y, | |||||
]; | |||||
const позиции = мир.раскладкаKMahjongg.позиции; | |||||
мир.фишки = []; | |||||
for (var номер in позиции) | |||||
{ | |||||
var фишка = мир.фишка.clone(); | |||||
мир.фишки.push(фишка); | |||||
мир.корень.add(фишка); | |||||
var позиция = позиции[номер]; | |||||
var слой = позиция[0]; | |||||
var ряд = позиция[1]; | |||||
var столбец = позиция[2]; | |||||
фишка.position.x = столбец * размеры[0]; | |||||
фишка.position.z = ряд * размеры[1]; | |||||
фишка.position.y = слой; | |||||
} | |||||
}; | }; | ||||
// // // // | // // // // | ||||
УбратьПереворотТекстурыФишки = мир => | |||||
ЗагрузитьРаскладку = мир => | |||||
{ | { | ||||
мир.текстураФишки.flipY = false; | |||||
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ); | |||||
//var ресурс = "/cat.layout"; | |||||
var ресурс = "/X_shaped.layout"; | |||||
var содержимое = модуль.содержимое[ресурс]; | |||||
мир.раскладкаKMahjongg = { | |||||
"содержимое": содержимое, | |||||
}; | |||||
}; | }; | ||||
@@ -26,8 +62,8 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||||
ПовернутьФишку = мир => | ПовернутьФишку = мир => | ||||
{ | { | ||||
мир.модельФишки.rotation.x += 0.03; | |||||
мир.модельФишки.rotation.y += 0.02; | |||||
мир.фишка.rotation.x += 0.03; | |||||
мир.фишка.rotation.y += 0.02; | |||||
}; | }; | ||||
@@ -61,7 +97,7 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||||
ПодготовитьСцену = мир => | ПодготовитьСцену = мир => | ||||
{ | { | ||||
var коэффициент = 2; | var коэффициент = 2; | ||||
var расстояние = 5; | |||||
var расстояние = 20; | |||||
мир.камера.position.y = расстояние * коэффициент; | мир.камера.position.y = расстояние * коэффициент; | ||||
мир.камера.position.z = расстояние; | мир.камера.position.z = расстояние; | ||||
мир.камера.lookAt(new THREE.Vector3(0, 0, 0)); | мир.камера.lookAt(new THREE.Vector3(0, 0, 0)); | ||||
@@ -69,22 +105,19 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||||
мир.свет = new THREE.DirectionalLight(0xffffff, 1); | мир.свет = new THREE.DirectionalLight(0xffffff, 1); | ||||
мир.свет.position.set(-0.5, 1, 0.5).normalize(); | мир.свет.position.set(-0.5, 1, 0.5).normalize(); | ||||
мир.сцена.add(мир.свет); | мир.сцена.add(мир.свет); | ||||
мир.корень = new THREE.Group(); | |||||
мир.сцена.add(мир.корень); | |||||
}; | }; | ||||
// // // // | // // // // | ||||
СоздатьФишку = мир => | |||||
ПодготовитьФишку = мир => | |||||
{ | { | ||||
мир.сцена.add(мир.модельФишки); | |||||
var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки}); | var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки}); | ||||
мир.модельФишки.traverse(function(ребёнок) { | |||||
if (ребёнок.isMesh) | |||||
{ | |||||
ребёнок.material = материал; | |||||
} | |||||
}); | |||||
мир.фишка.material = материал; | |||||
}; | }; | ||||
@@ -102,6 +135,7 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||||
адрес, | адрес, | ||||
function(текстура) { | function(текстура) { | ||||
мир.текстураФишки = текстура; | мир.текстураФишки = текстура; | ||||
мир.текстураФишки.flipY = false; | |||||
мир.уведомить("загрузили текстуру фишки из модуля"); | мир.уведомить("загрузили текстуру фишки из модуля"); | ||||
}, | }, | ||||
null, | null, | ||||
@@ -124,17 +158,24 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||||
// // // // | // // // // | ||||
ЗагрузитьМодельФишки = мир => | |||||
ЗагрузитьФишку = мир => | |||||
{ | { | ||||
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ); | var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ); | ||||
var ресурс = "/фишка.gltf"; | var ресурс = "/фишка.gltf"; | ||||
var адрес = `${window.location.origin}${ресурс}`; | var адрес = `${window.location.origin}${ресурс}`; | ||||
THREE.Cache.enabled = true; | |||||
THREE.Cache.add(адрес, модуль.содержимое[ресурс]); | THREE.Cache.add(адрес, модуль.содержимое[ресурс]); | ||||
мир.загрузчикGLTF.load( | мир.загрузчикGLTF.load( | ||||
адрес, | адрес, | ||||
function(gltf) { | function(gltf) { | ||||
мир.модельФишки = gltf.scene; | |||||
мир.уведомить("загрузили модель фишки"); | |||||
// Вычленяем Mesh. | |||||
gltf.scene.traverse(function(ребёнок) { | |||||
if (ребёнок.isMesh) | |||||
{ | |||||
мир.фишка = ребёнок; | |||||
} | |||||
}); | |||||
мир.уведомить("загрузили фишку"); | |||||
}, | }, | ||||
null, | null, | ||||
function(error) { | function(error) { | ||||
@@ -5,14 +5,17 @@ | |||||
изменить размер отрисовщика ThreeJS | изменить размер отрисовщика ThreeJS | ||||
создать загрузчик GLTF | создать загрузчик GLTF | ||||
создать загрузчик текстур | создать загрузчик текстур | ||||
включить кэширование ресурсов ThreeJS для загрузки ресурсов из модулей | |||||
подготовить сцену | подготовить сцену | ||||
загрузить модель фишки | |||||
загрузили модель фишки | |||||
загрузить фишку | |||||
загрузили фишку | |||||
загрузить текстуру фишки из модуля | загрузить текстуру фишки из модуля | ||||
загрузили текстуру фишки из модуля | загрузили текстуру фишки из модуля | ||||
убрать переворот текстуры фишки | |||||
создать фишку | |||||
загрузить раскладку | |||||
разобрать раскладку KMahjongg | |||||
разобрали раскладку KMahjongg | |||||
подготовить фишку | |||||
отобразить раскладку одной фишкой | |||||
центрировать сцену | |||||
запустить отрисовку | запустить отрисовку | ||||
# запустить таймер поворота фишки | # запустить таймер поворота фишки | ||||
изменили размер окна браузера | изменили размер окна браузера | ||||