@@ -2,7 +2,9 @@ | |||||
1.0.0 | 1.0.0 | ||||
https://git.opengamestudio.org/mahjong/mahjong-scena | https://git.opengamestudio.org/mahjong/mahjong-scena | ||||
/загрузка|loading.js | |||||
x /загрузка|loading.js | |||||
/загрузка|loading.череда | /загрузка|loading.череда | ||||
x /пуск|run.js | x /пуск|run.js | ||||
/пуск|run.череда | |||||
/пуск|run.череда | |||||
x /фишки|tiles.js | |||||
/фишки|tiles.череда |
@@ -1,11 +1,12 @@ | |||||
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; | |||||
const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts"; | |||||
// // // // | // // // // | ||||
УведомитьОбОкончанииЗагрузок = мир => | |||||
УведомитьОЗагрузкеРесурсовСцены = мир => | |||||
{ | { | ||||
мир.уведомить("окончили загрузки"); | |||||
мир.уведомить("загрузили ресурсы сцены"); | |||||
}; | }; | ||||
@@ -1,11 +1,10 @@ | |||||
подготовили сцену | |||||
надо загрузить ресурсы сцены | |||||
загрузить фишку | загрузить фишку | ||||
загрузили фишку | загрузили фишку | ||||
# загрузить раскладку | |||||
загрузить отладочную раскладку | загрузить отладочную раскладку | ||||
разобрать раскладку KMahjongg | разобрать раскладку KMahjongg | ||||
разобрали раскладку KMahjongg | разобрали раскладку KMahjongg | ||||
задать отладочную тему фишек для загрузки | задать отладочную тему фишек для загрузки | ||||
загрузить тему фишек маджонга | загрузить тему фишек маджонга | ||||
загрузили тему фишек маджонга | загрузили тему фишек маджонга | ||||
уведомить об окончании загрузок | |||||
уведомить о загрузке ресурсов сцены |
@@ -3,6 +3,109 @@ | |||||
// // // // | // // // // | ||||
ИсправитьОтслеживаниеНажатийНаIOS = мир => | |||||
{ | |||||
// https://stackoverflow.com/a/31459240/3404710 | |||||
мир.отрисовщик.domElement.style.cursor = "pointer"; | |||||
}; | |||||
// // // // | |||||
ОтслеживатьНажатияПальцем = мир => | |||||
{ | |||||
window.addEventListener( | |||||
"touchstart", | |||||
function(событие) { | |||||
var позиция = new THREE.Vector2(); | |||||
позиция.x = (событие.touches[0].clientX / window.innerWidth) * 2 - 1; | |||||
позиция.y = - (событие.touches[0].clientY / window.innerHeight) * 2 + 1; | |||||
мир.позицияНажатия = позиция; | |||||
мир.уведомить("нажали"); | |||||
} | |||||
); | |||||
}; | |||||
// // // // | |||||
ОтслеживатьНажатияМышью = мир => | |||||
{ | |||||
window.addEventListener( | |||||
"click", | |||||
function(событие) { | |||||
var позиция = new THREE.Vector2(); | |||||
позиция.x = (событие.clientX / window.innerWidth) * 2 - 1; | |||||
позиция.y = - (событие.clientY / window.innerHeight) * 2 + 1; | |||||
мир.позицияНажатия = позиция; | |||||
мир.уведомить("нажали"); | |||||
} | |||||
); | |||||
}; | |||||
// // // // | |||||
ЦентрироватьСцену = мир => | |||||
{ | |||||
var мин = { | |||||
"x": 0, | |||||
"z": 0, | |||||
}; | |||||
var макс = { | |||||
"x": 0, | |||||
"z": 0, | |||||
}; | |||||
for (var номер in мир.фишки) | |||||
{ | |||||
const фишка = мир.фишки[номер]; | |||||
if (фишка.position.x < мин.x) | |||||
{ | |||||
мин.x = фишка.position.x; | |||||
} | |||||
if (фишка.position.x > макс.x) | |||||
{ | |||||
макс.x = фишка.position.x; | |||||
} | |||||
if (фишка.position.z < мин.z) | |||||
{ | |||||
мин.z = фишка.position.z; | |||||
} | |||||
if (фишка.position.z > макс.z) | |||||
{ | |||||
макс.z = фишка.position.z; | |||||
} | |||||
} | |||||
мир.корень.position.x -= (макс.x - мин.x) / 2; | |||||
мир.корень.position.z -= (макс.z - мин.z) / 2; | |||||
}; | |||||
// // // // | |||||
СоздатьФишкиВСцене = мир => | |||||
{ | |||||
мир.уведомить("надо создать фишки в сцене"); | |||||
}; | |||||
// // // // | |||||
ЗагрузитьРесурсыСцены = мир => | |||||
{ | |||||
мир.уведомить("надо загрузить ресурсы сцены"); | |||||
}; | |||||
// // // // | |||||
ПодготовитьСцену = мир => | ПодготовитьСцену = мир => | ||||
{ | { | ||||
var коэффициент = 2; | var коэффициент = 2; | ||||
@@ -17,8 +120,6 @@ | |||||
мир.корень = new THREE.Group(); | мир.корень = new THREE.Group(); | ||||
мир.сцена.add(мир.корень); | мир.сцена.add(мир.корень); | ||||
мир.уведомить("подготовили сцену"); | |||||
}; | }; | ||||
@@ -6,6 +6,15 @@ | |||||
создать загрузчик GLTF | создать загрузчик GLTF | ||||
создать загрузчик текстур | создать загрузчик текстур | ||||
подготовить сцену | подготовить сцену | ||||
загрузить ресурсы сцены | |||||
загрузили ресурсы сцены | |||||
создать фишки в сцене | |||||
создали фишки в сцене | |||||
центрировать сцену | |||||
отслеживать нажатия мышью | |||||
отслеживать нажатия пальцем | |||||
исправить отслеживание нажатий на IOS | |||||
запустить отрисовку | запустить отрисовку | ||||
изменили размер окна браузера | изменили размер окна браузера | ||||
изменить размер отрисовщика ThreeJS | изменить размер отрисовщика ThreeJS |
@@ -0,0 +1,180 @@ | |||||
// // // // | |||||
УведомитьОСозданииФишекВСцене = мир => | |||||
{ | |||||
мир.уведомить("создали фишки в сцене"); | |||||
}; | |||||
// // // // | |||||
ОкраситьВыбранныеФишки = мир => | |||||
{ | |||||
// Очищаем цвета всех фишек. | |||||
for (var номер in мир.фишки) | |||||
{ | |||||
var фишка = мир.фишки[номер]; | |||||
var группа = мир.группыФишек[номер]; | |||||
var материал = мир.материалыФишек[группа]; | |||||
фишка.material = материал; | |||||
} | |||||
// Окрашиваем выбранные фишки. | |||||
for (var id in мир.номераВыбранныхФишек) | |||||
{ | |||||
var номер = мир.номераВыбранныхФишек[id]; | |||||
var фишка = мир.фишки[номер]; | |||||
var группа = мир.группыФишек[номер]; | |||||
var материал = мир.материалыВыбранныхФишек[группа]; | |||||
фишка.material = материал; | |||||
} | |||||
}; | |||||
// // // // | |||||
ВывестиВыбранныеФишки = мир => | |||||
{ | |||||
var номер = мир.номерВыбраннойФишки; | |||||
var группа = мир.группыФишек[номер]; | |||||
console.debug(`Выбрали фишку. номер: '${номер}' группа: '${группа}'`); | |||||
console.debug("Номера выбранных фишек", мир.номераВыбранныхФишек); | |||||
}; | |||||
// // // // | |||||
ВыбратьФишкуВКоординатахНажатия = мир => | |||||
{ | |||||
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера); | |||||
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children); | |||||
if (пересечения.length) | |||||
{ | |||||
var фишка = пересечения[0].object; | |||||
var номер = номерФишки(мир.фишки, фишка.id); | |||||
if (номер) | |||||
{ | |||||
мир.номерВыбраннойФишки = номер; | |||||
мир.номераВыбранныхФишек.push(номер); | |||||
мир.уведомить("выбор фишки"); | |||||
} | |||||
} | |||||
}; | |||||
// // // // | |||||
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир => | |||||
{ | |||||
мир.материалыВыбранныхФишек = []; | |||||
for (var номер in мир.материалыФишек) | |||||
{ | |||||
var материал = мир.материалыФишек[номер].clone(); | |||||
материал.color = new THREE.Color(0xff0000); | |||||
мир.материалыВыбранныхФишек.push(материал); | |||||
} | |||||
}; | |||||
// // // // | |||||
ПодготовитьВыборФишек = мир => | |||||
{ | |||||
мир.номераВыбранныхФишек = []; | |||||
}; | |||||
// // // // | |||||
ЗадатьМатериалыФишкамПоГруппам = мир => | |||||
{ | |||||
for (var номер in мир.группыФишек) | |||||
{ | |||||
var группа = мир.группыФишек[номер]; | |||||
var материал = мир.материалыФишек[группа]; | |||||
фишка = мир.фишки[номер]; | |||||
фишка.material = материал; | |||||
} | |||||
}; | |||||
// // // // | |||||
СоздатьГруппыФишек = мир => | |||||
{ | |||||
мир.группыФишек = []; | |||||
const позиции = мир.раскладкаKMahjongg.позиции; | |||||
var группа = 0; | |||||
for (var номер in позиции) | |||||
{ | |||||
мир.группыФишек.push(группа); | |||||
// Меняем группу каждую пару фишек. | |||||
if (номер % 2 == 1) | |||||
{ | |||||
++группа; | |||||
// Начинаем группы заново, как только они заканчиваются. | |||||
if (группа >= 42) | |||||
{ | |||||
группа = 0; | |||||
} | |||||
} | |||||
} | |||||
}; | |||||
// // // // | |||||
СоздатьУзлыФишек = мир => | |||||
{ | |||||
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 = слой; | |||||
} | |||||
}; | |||||
// // // // | |||||
СоздатьМатериалыФишекОтладочнойТемы = мир => | |||||
{ | |||||
мир.материалыФишек = []; | |||||
var тема = "отладочная|debug"; | |||||
for (var номер = 1; номер <= 42; ++номер) | |||||
{ | |||||
var текстура = мир.текстурыТемФишек[тема][номер]; | |||||
var материал = new THREE.MeshLambertMaterial({map: текстура}); | |||||
мир.материалыФишек.push(материал); | |||||
} | |||||
}; |
@@ -0,0 +1,14 @@ | |||||
надо создать фишки в сцене | |||||
создать материалы фишек отладочной темы | |||||
создать узлы фишек | |||||
создать группы фишек | |||||
задать материалы фишкам по группам | |||||
подготовить выбор фишек | |||||
создать материалы выбранных фишек отладочной темы | |||||
уведомить о создании фишек в сцене | |||||
нажали | |||||
выбрать фишку в координатах нажатия | |||||
выбор фишки | |||||
вывести выбранные фишки | |||||
окрасить выбранные фишки |