From b7de06d51561a02993f7d7ab8b62962ad2ec6301 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D0=BB=D0=B0=D0=B2=D1=80=D0=B5=D0=B4=20=7C=20Glavred?= Date: Thu, 17 Sep 2020 16:42:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BE=D1=82=20=D0=93=D0=BB=D0=B0=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=B4=D0=B0=20=D0=93=D0=B8=D1=82=D0=96=D0=A1=20|=20Chang?= =?UTF-8?q?es=20of=20GitJS=20Glavred?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0000 | 6 +- загрузка|loading.js | 7 +- загрузка|loading.череда | 5 +- пуск|run.js | 105 ++++++++++++++- пуск|run.череда | 9 ++ фишки|tiles.js | 180 ++++++++++++++++++++++++++ фишки|tiles.череда | 14 ++ 7 files changed, 316 insertions(+), 10 deletions(-) create mode 100644 фишки|tiles.js create mode 100644 фишки|tiles.череда diff --git a/0000 b/0000 index c1c3189..9edd28a 100644 --- a/0000 +++ b/0000 @@ -2,7 +2,9 @@ 1.0.0 https://git.opengamestudio.org/mahjong/mahjong-scena -/загрузка|loading.js +x /загрузка|loading.js /загрузка|loading.череда x /пуск|run.js -/пуск|run.череда \ No newline at end of file +/пуск|run.череда +x /фишки|tiles.js +/фишки|tiles.череда \ No newline at end of file diff --git a/загрузка|loading.js b/загрузка|loading.js index 20d3ca6..6d77d35 100644 --- a/загрузка|loading.js +++ b/загрузка|loading.js @@ -1,11 +1,12 @@ - +const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; +const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts"; // // // // -УведомитьОбОкончанииЗагрузок = мир => +УведомитьОЗагрузкеРесурсовСцены = мир => { - мир.уведомить("окончили загрузки"); + мир.уведомить("загрузили ресурсы сцены"); }; diff --git a/загрузка|loading.череда b/загрузка|loading.череда index fd003f3..95964b3 100644 --- a/загрузка|loading.череда +++ b/загрузка|loading.череда @@ -1,11 +1,10 @@ -подготовили сцену +надо загрузить ресурсы сцены загрузить фишку загрузили фишку -# загрузить раскладку загрузить отладочную раскладку разобрать раскладку KMahjongg разобрали раскладку KMahjongg задать отладочную тему фишек для загрузки загрузить тему фишек маджонга загрузили тему фишек маджонга - уведомить об окончании загрузок \ No newline at end of file + уведомить о загрузке ресурсов сцены \ No newline at end of file diff --git a/пуск|run.js b/пуск|run.js index e0c0a51..5708446 100644 --- a/пуск|run.js +++ b/пуск|run.js @@ -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; @@ -17,8 +120,6 @@ мир.корень = new THREE.Group(); мир.сцена.add(мир.корень); - - мир.уведомить("подготовили сцену"); }; diff --git a/пуск|run.череда b/пуск|run.череда index 756b190..0680eb4 100644 --- a/пуск|run.череда +++ b/пуск|run.череда @@ -6,6 +6,15 @@ создать загрузчик GLTF создать загрузчик текстур подготовить сцену + загрузить ресурсы сцены +загрузили ресурсы сцены + создать фишки в сцене +создали фишки в сцене + центрировать сцену + отслеживать нажатия мышью + отслеживать нажатия пальцем + исправить отслеживание нажатий на IOS запустить отрисовку + изменили размер окна браузера изменить размер отрисовщика ThreeJS \ No newline at end of file diff --git a/фишки|tiles.js b/фишки|tiles.js new file mode 100644 index 0000000..588a3e1 --- /dev/null +++ b/фишки|tiles.js @@ -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(материал); + } +}; \ No newline at end of file diff --git a/фишки|tiles.череда b/фишки|tiles.череда new file mode 100644 index 0000000..8740280 --- /dev/null +++ b/фишки|tiles.череда @@ -0,0 +1,14 @@ +надо создать фишки в сцене + создать материалы фишек отладочной темы + создать узлы фишек + создать группы фишек + задать материалы фишкам по группам + подготовить выбор фишек + создать материалы выбранных фишек отладочной темы + уведомить о создании фишек в сцене + +нажали + выбрать фишку в координатах нажатия +выбор фишки + вывести выбранные фишки + окрасить выбранные фишки