|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- const ИМЯ = "ОМ | MB";
- const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
- const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts";
-
-
- // // // //
-
-
- ОкраситьВыбранныеФишки = мир =>
- {
- // Очищаем цвета всех фишек.
- 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(материал);
- }
- };
-
-
- // // // //
-
-
- ЗагрузитьОтладочнуюРаскладку = мир =>
- {
- var модуль = мир.модули.модульПоИмени(ИМЯ_ОТЛ_РАСКЛАДКИ);
- var ресурс = "/успех|success.layout";
- var содержимое = модуль.содержимое[ресурс];
- мир.раскладкаKMahjongg = {
- "содержимое": содержимое,
- };
- };
-
-
- // // // //
-
-
- ВывестиКоординатыНажатия = мир =>
- {
- var п = мир.позицияНажатия;
- console.debug("нажатие", п.x, п.y);
- };
-
-
- // // // //
-
-
- ИсправитьОтслеживаниеНажатийНа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;
- мир.позицияНажатия = позиция;
- мир.уведомить("нажали");
- }
- );
- };
-
-
- // // // //
-
-
- ЗадатьМатериалыФишкамПоГруппам = мир =>
- {
- 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 границы = мир.фишка.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 номерМатериала = номер % 42;
- var материал = мир.материалыФишек[номерМатериала];
- фишка.material = материал;
- }
- };
-
-
- // // // //
-
-
- СоздатьМатериалыФишекОтладочнойТемы = мир =>
- {
- мир.материалыФишек = [];
- var тема = "отладочная|debug";
- for (var номер = 1; номер <= 42; ++номер)
- {
- var текстура = мир.текстурыТемФишек[тема][номер];
- var материал = new THREE.MeshLambertMaterial({map: текстура});
- мир.материалыФишек.push(материал);
- }
- };
-
-
- // // // //
-
-
- ВывестиФактЗагрузкиТемыФишекМаджонга = мир =>
- {
- console.debug("ВывестиФактЗагрузкиТемыФишекМаджонга");
- };
-
-
- // // // //
-
-
- ЗадатьТемуФишекДляЗагрузки = мир =>
- {
- мир.темаФишек = "отладочная|debug";
- };
-
-
- // // // //
-
-
- ЦентрироватьСцену = мир =>
- {
- 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 границы = мир.фишка.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 модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
- //var ресурс = "/cat.layout";
- var ресурс = "/X_shaped.layout";
- var содержимое = модуль.содержимое[ресурс];
- мир.раскладкаKMahjongg = {
- "содержимое": содержимое,
- };
- };
-
-
- // // // //
-
-
- ПовернутьФишку = мир =>
- {
- мир.фишка.rotation.x += 0.03;
- мир.фишка.rotation.y += 0.02;
- };
-
-
- // // // //
-
-
- Отладка = мир =>
- {
- console.debug("Отладка", Date());
- };
-
-
- // // // //
-
-
- ЗапуститьТаймерПоворотаФишки = мир =>
- {
- setInterval(
- function() {
- мир.уведомить("поворот фишки");
- },
- 60
- );
-
- };
-
-
- // // // //
-
-
- ПодготовитьСцену = мир =>
- {
- var коэффициент = 2;
- var расстояние = 6;
- мир.камера.position.y = расстояние * коэффициент;
- мир.камера.position.z = расстояние;
- мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
-
- мир.свет = new THREE.DirectionalLight(0xffffff, 1);
- мир.свет.position.set(-0.5, 1, 0.5).normalize();
- мир.сцена.add(мир.свет);
-
- мир.корень = new THREE.Group();
- мир.сцена.add(мир.корень);
- };
-
-
- // // // //
-
-
- ПодготовитьФишку = мир =>
- {
- var материал = new THREE.MeshLambertMaterial({map: мир.текстураФишки});
- мир.фишка.material = материал;
- };
-
-
- // // // //
-
-
- ЗагрузитьТекстуруФишкиИзМодуля = мир =>
- {
- var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
- var ресурс = "/текстура.png";
- var содержимое = модуль.содержимое[ресурс];
- var b64 = base64js.fromByteArray(new Uint8Array(содержимое));
- var адрес = `data:image/png;base64,${b64}`;
- мир.загрузчикТекстур.load(
- адрес,
- function(текстура) {
- мир.текстураФишки = текстура;
- мир.текстураФишки.flipY = false;
- мир.уведомить("загрузили текстуру фишки из модуля");
- },
- null,
- function(error) {
- console.error("ОШИБКА | ERROR", error);
- }
- );
- };
-
-
- // // // //
-
-
- СоздатьЗагрузчикТекстур = мир =>
- {
- мир.загрузчикТекстур = new THREE.TextureLoader();
- };
-
-
- // // // //
-
-
- ЗагрузитьФишку = мир =>
- {
- var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
- var ресурс = "/фишка.gltf";
- var адрес = `${window.location.origin}${ресурс}`;
- THREE.Cache.enabled = true;
- THREE.Cache.add(адрес, модуль.содержимое[ресурс]);
- мир.загрузчикGLTF.load(
- адрес,
- function(gltf) {
- // Вычленяем Mesh.
- gltf.scene.traverse(function(ребёнок) {
- if (ребёнок.isMesh)
- {
- мир.фишка = ребёнок;
- }
- });
- мир.уведомить("загрузили фишку");
- },
- null,
- function(error) {
- console.error("ОШИБКА | ERROR", error);
- }
- );
- };
-
-
- // // // //
-
-
- СоздатьЗагрузчикGLTF = мир =>
- {
- мир.загрузчикGLTF = new THREE.GLTFLoader();
- };
-
|