@@ -6,5 +6,7 @@ x /интерфейс|ui.js | |||
/интерфейс|ui.череда | |||
x /пуск|run.js | |||
/пуск|run.череда | |||
x /раскладка|layout.js | |||
/раскладка|layout.череда | |||
x /сцена|scene.js | |||
/сцена|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 БАЗА = "https://git.opengamestudio.org/mahjong/mahjong-modeli-models/raw/branch/master/"; | |||
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 расстояние = 5; | |||
var расстояние = 20; | |||
мир.камера.position.y = расстояние * коэффициент; | |||
мир.камера.position.z = расстояние; | |||
мир.камера.lookAt(new THREE.Vector3(0, 0, 0)); | |||
@@ -69,22 +105,19 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||
мир.свет = new THREE.DirectionalLight(0xffffff, 1); | |||
мир.свет.position.set(-0.5, 1, 0.5).normalize(); | |||
мир.сцена.add(мир.свет); | |||
мир.корень = new THREE.Group(); | |||
мир.сцена.add(мир.корень); | |||
}; | |||
// // // // | |||
СоздатьФишку = мир => | |||
ПодготовитьФишку = мир => | |||
{ | |||
мир.сцена.add(мир.модельФишки); | |||
var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки}); | |||
мир.модельФишки.traverse(function(ребёнок) { | |||
if (ребёнок.isMesh) | |||
{ | |||
ребёнок.material = материал; | |||
} | |||
}); | |||
мир.фишка.material = материал; | |||
}; | |||
@@ -102,6 +135,7 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||
адрес, | |||
function(текстура) { | |||
мир.текстураФишки = текстура; | |||
мир.текстураФишки.flipY = false; | |||
мир.уведомить("загрузили текстуру фишки из модуля"); | |||
}, | |||
null, | |||
@@ -124,17 +158,24 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | | |||
// // // // | |||
ЗагрузитьМодельФишки = мир => | |||
ЗагрузитьФишку = мир => | |||
{ | |||
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ); | |||
var ресурс = "/фишка.gltf"; | |||
var адрес = `${window.location.origin}${ресурс}`; | |||
THREE.Cache.enabled = true; | |||
THREE.Cache.add(адрес, модуль.содержимое[ресурс]); | |||
мир.загрузчикGLTF.load( | |||
адрес, | |||
function(gltf) { | |||
мир.модельФишки = gltf.scene; | |||
мир.уведомить("загрузили модель фишки"); | |||
// Вычленяем Mesh. | |||
gltf.scene.traverse(function(ребёнок) { | |||
if (ребёнок.isMesh) | |||
{ | |||
мир.фишка = ребёнок; | |||
} | |||
}); | |||
мир.уведомить("загрузили фишку"); | |||
}, | |||
null, | |||
function(error) { | |||
@@ -5,14 +5,17 @@ | |||
изменить размер отрисовщика ThreeJS | |||
создать загрузчик GLTF | |||
создать загрузчик текстур | |||
включить кэширование ресурсов ThreeJS для загрузки ресурсов из модулей | |||
подготовить сцену | |||
загрузить модель фишки | |||
загрузили модель фишки | |||
загрузить фишку | |||
загрузили фишку | |||
загрузить текстуру фишки из модуля | |||
загрузили текстуру фишки из модуля | |||
убрать переворот текстуры фишки | |||
создать фишку | |||
загрузить раскладку | |||
разобрать раскладку KMahjongg | |||
разобрали раскладку KMahjongg | |||
подготовить фишку | |||
отобразить раскладку одной фишкой | |||
центрировать сцену | |||
запустить отрисовку | |||
# запустить таймер поворота фишки | |||
изменили размер окна браузера | |||