2 Commits

7 changed files with 129 additions and 263 deletions

View File

@@ -1,4 +1,5 @@
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
const УКАЗАТЕЛЬ_МОДУЛЯ_РЕСУРСОВ = "https://git.opengamestudio.org/mahjong/mahjong-res/raw/commit/5430b4d62bcc3d60f1e570485ee5cd562b70582d/0000";
const УКАЗАТЕЛЬ_ОТЛ_РАСКЛАДКИ = "https://git.opengamestudio.org/mahjong/mahjong-otl-raskladki-dbg-layouts/raw/commit/2951feab28448266d3446974e781d320ebbed8df/0000";
// // // //
@@ -12,11 +13,31 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга |
// // // //
ЗадатьОтладочнуюТемуФишекДляЗагрузки = мир =>
{
мир.темаФишек = "отладочная|debug";
};
// // // //
ЗагрузитьВыбраннуюРаскладку = мир =>
{
var детали = мир.реестрРаскладок[мир.выбраннаяРаскладка];
var модуль = мир.модули.модульПоИмени(детали["🗿"]);
var содержимое = модуль.содержимое[детали["📁"]];
var указательМодуля = УКАЗАТЕЛЬ_МОДУЛЯ_РЕСУРСОВ;
var ресурс = "/X_shaped.layout";
if (мир.выбраннаяРаскладка == "😀")
{
ресурс = "/успех|success.layout";
указательМодуля = УКАЗАТЕЛЬ_ОТЛ_РАСКЛАДКИ;
}
else if (мир.выбраннаяРаскладка == "😭")
{
ресурс = "/провал|failure.layout";
указательМодуля = УКАЗАТЕЛЬ_ОТЛ_РАСКЛАДКИ;
}
var модуль = мир.модули.модульПоУказателю(указательМодуля);
var содержимое = модуль.содержимое[ресурс];
мир.раскладкаKMahjongg = {
"содержимое": содержимое,
};
@@ -28,7 +49,7 @@ const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга |
ЗагрузитьФишку = мир =>
{
var модуль = мир.модули.модульПоИмени(ИМЯ_МОДУЛЯ_РЕСУРСОВ);
var модуль = мир.модули.модульПоУказателю(УКАЗАТЕЛЬ_МОДУЛЯ_РЕСУРСОВ);
var ресурс = "/фишка.gltf";
var адрес = `${window.location.origin}${ресурс}`;
THREE.Cache.enabled = true;

View File

@@ -1,6 +1,10 @@
надо загрузить ресурсы сцены
загрузить фишку
загрузили фишку
загрузить выбранную раскладку
разобрать раскладку KMahjongg
разобрали раскладку KMahjongg
задать отладочную тему фишек для загрузки
загрузить тему фишек маджонга
загрузили тему фишек маджонга
уведомить о загрузке ресурсов сцены

View File

@@ -3,75 +3,6 @@
// // // //
ВыбратьТемуФишекОтладочную = мир =>
{
мир.выбраннаяТема = "отладочная|debug";
//мир.уведомить("выбрали тему");
};
// // // //
ВыбратьРаскладкуX = мир =>
{
мир.выбраннаяРаскладка = "X_shaped";
мир.уведомить("выбрали раскладку");
};
// // // //
ИзменитьРазмерОтрисовщикаThreeJS = мир =>
{
var ширина = window.innerWidth * мир.масштаб;
var высота = window.innerHeight * мир.масштаб;
мир.камера.aspect = ширина / высота;
мир.камера.updateProjectionMatrix();
мир.отрисовщик.setSize(ширина, высота);
var размер = мир.масштаб * 100;
мир.канва.style = `
max-width: ${размер}%;
max-height: ${размер}%;
width: ${размер}%;
height: ${размер}%;
`;
};
// // // //
ЗадатьОтладочныйМасштаб = мир =>
{
мир.масштаб = 3;
мир.уведомить("изменили масштаб");
};
// // // //
ВключитьОтслеживаниеНажатий = мир =>
{
мир.отслеживатьНажатия = true;
};
// // // //
ОтключитьОтслеживаниеНажатий = мир =>
{
мир.отслеживатьНажатия = false;
};
// // // //
ИсправитьОтслеживаниеНажатийНаIOS = мир =>
{
// https://stackoverflow.com/a/31459240/3404710
@@ -82,22 +13,35 @@ height: ${размер}%;
// // // //
ПодготовитьсяКОтслеживаниюНажатий = мир =>
ОтслеживатьНажатияПальцем = мир =>
{
мир.отслеживатьНажатия = false;
// Палец.
window.addEventListener(
"touchstart",
function(событие) {
сообщитьОНажатии(мир, событие.touches[0]);
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;
мир.позицияНажатия = позиция;
мир.уведомить("нажали");
}
);
};
@@ -144,9 +88,9 @@ height: ${размер}%;
// // // //
РазобратьРаскладкуKMahjongg = мир =>
СоздатьФишкиВСцене = мир =>
{
мир.раскладкаKMahjongg.позиции = разобратьРаскладкуKMahjongg(мир.раскладкаKMahjongg.содержимое);
мир.уведомить("надо создать фишки в сцене");
};
@@ -173,6 +117,9 @@ height: ${размер}%;
мир.свет = new THREE.DirectionalLight(0xffffff, 1);
мир.свет.position.set(-0.5, 1, 0.5).normalize();
мир.сцена.add(мир.свет);
мир.корень = new THREE.Group();
мир.сцена.add(мир.корень);
};
@@ -193,51 +140,3 @@ height: ${размер}%;
мир.загрузчикGLTF = new THREE.GLTFLoader();
};
// // // //
НастроитьThreeJS = мир =>
{
мир.сцена = new THREE.Scene();
мир.сцена.background = new THREE.Color(0xFFFFFF);
мир.камера = new THREE.PerspectiveCamera(45, 1, 0.1, 1000);
мир.ловецНажатий = new THREE.Raycaster();
мир.отрисовщик = new THREE.WebGLRenderer({canvas: мир.канва, antialias: true});
};
// // // //
СоздатьКанвуThreeJS = мир =>
{
мир.канва = document.createElement("canvas");
мир.канва.id = "канва-threejs";
мир.канва.style = `
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
`;
var первый = document.body.firstChild;
if (первый)
{
document.body.insertBefore(мир.канва, первый);
}
else
{
document.body.appendChild(мир.канва);
}
};
// // // //
СоздатьМасштаб = мир =>
{
мир.масштаб = 1;
};

View File

@@ -1,29 +1,20 @@
пуск модулей маджонга
создать масштаб
создать канву ThreeJS
выбрали раскладку
настроить ThreeJS
встроить отрисовщика ThreeJS
отслеживать изменение размера окна браузера
изменить размер отрисовщика ThreeJS
создать загрузчик GLTF
создать загрузчик текстур
подготовить сцену
подготовиться к отслеживанию нажатий
исправить отслеживание нажатий на IOS
запустить отрисовку
выбрать тему фишек отладочную
загрузить ресурсы сцены
загрузили ресурсы сцены
выбрать раскладку X
подготовиться к созданию фишек в сцене
включить отслеживание нажатий
создать фишки в сцене
создали фишки в сцене
центрировать сцену
отслеживать нажатия мышью
отслеживать нажатия пальцем
исправить отслеживание нажатий на IOS
запустить отрисовку
изменили размер окна браузера
изменить размер отрисовщика ThreeJS
изменили масштаб
изменить размер отрисовщика ThreeJS
выбрали раскладку
загрузить выбранную раскладку
разобрать раскладку KMahjongg
создать фишки в сцене
центрировать сцену
изменить размер отрисовщика ThreeJS

View File

@@ -3,15 +3,6 @@
// // // //
ВывестиКоординатыНажатия = мир =>
{
console.debug("Координаты нажатия:", мир.позицияНажатия.x, мир.позицияНажатия.y);
};
// // // //
УведомитьОПоражении = мир =>
{
мир.уведомить("поражение");
@@ -357,7 +348,6 @@
console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
};
// // // //
@@ -396,31 +386,9 @@
// // // //
ВывестиНайденнуюФишку = мир =>
УведомитьОСозданииФишекВСцене = мир =>
{
var номер = мир.номерНайденнойФишки;
var группа = мир.группыФишек[номер];
console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
};
// // // //
НайтиФишкуВКоординатахНажатия = мир =>
{
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
if (пересечения.length)
{
var фишка = пересечения[0].object;
var номер = номерФишки(мир.фишки, фишка.id);
if (номер)
{
мир.номерНайденнойФишки = номер;
мир.уведомить("нашли фишку в координатах нажатия");
}
}
мир.уведомить("создали фишки в сцене");
};
@@ -452,6 +420,62 @@
// // // //
ВывестиНайденнуюФишку = мир =>
{
var номер = мир.номерНайденнойФишки;
var группа = мир.группыФишек[номер];
console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
};
// // // //
НайтиФишкуВКоординатахНажатия = мир =>
{
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
if (пересечения.length)
{
var фишка = пересечения[0].object;
var номер = номерФишки(мир.фишки, фишка.id);
if (номер)
{
мир.номерНайденнойФишки = номер;
мир.уведомить("нашли фишку в координатах нажатия");
}
}
};
// // // //
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
{
мир.материалыВыбранныхФишек = [];
for (var номер in мир.материалыФишек)
{
var материал = мир.материалыФишек[номер].clone();
материал.color = new THREE.Color(0xff0000);
мир.материалыВыбранныхФишек.push(материал);
}
};
// // // //
ПодготовитьПоискФишек = мир =>
{
мир.номераНайденныхФишек = [];
};
// // // //
ЗадатьМатериалыФишкамПоГруппам = мир =>
{
for (var номер in мир.группыФишек)
@@ -528,61 +552,14 @@
// // // //
ПодготовитьКореньФишек = мир =>
{
if (мир.корень && мир.сцена.children.includes(мир.корень))
{
мир.сцена.remove(мир.корень);
}
мир.корень = new THREE.Group();
мир.сцена.add(мир.корень);
};
// // // //
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
{
мир.материалыВыбранныхФишек = [];
for (var номер in мир.материалыФишек)
{
var материал = мир.материалыФишек[номер].clone();
материал.color = new THREE.Color(0xff0000);
мир.материалыВыбранныхФишек.push(материал);
}
};
// // // //
СоздатьМатериалыФишекОтладочнойТемы = мир =>
{
мир.материалыФишек = [];
var тема = "отладочная|debug";
for (var номер = 1; номер <= 42; ++номер)
{
var текстура = мир.текстурыТемФишек[мир.выбраннаяТема][номер];
var текстура = мир.текстурыТемФишек[тема][номер];
var материал = new THREE.MeshLambertMaterial({map: текстура});
мир.материалыФишек.push(материал);
}
};
// // // //
СоздатьФишкиВСцене = мир =>
{
мир.уведомить("надо создать фишки в сцене");
};
// // // //
ПодготовитьсяКСозданиюФишекВСцене = мир =>
{
мир.уведомить("надо подготовиться к созданию фишек в сцене");
};
};

View File

@@ -1,20 +1,17 @@
надо подготовиться к созданию фишек в сцене
создать материалы фишек отладочной темы
создать материалы выбранных фишек отладочной темы
надо создать фишки в сцене
подготовить корень фишек
создать материалы фишек отладочной темы
создать узлы фишек
создать группы фишек
задать материалы фишкам по группам
создать материалы выбранных фишек отладочной темы
создать индексы фишек
подготовить фишки к выбору
уведомить о создании фишек в сцене
включить возможность поиска фишки
нажали
проверить возможность поиска фишки
можно искать фишку
# вывести координаты нажатия
найти фишку в координатах нажатия
нашли фишку в координатах нажатия
вывести найденную фишку

View File

@@ -1,28 +1,5 @@
// // // //
сообщитьОНажатии = (мир, событие) =>
{
if (!мир.отслеживатьНажатия)
{
return;
}
var позиция = new THREE.Vector2();
var ширина = window.innerWidth * мир.масштаб;
var высота = window.innerHeight * мир.масштаб;
позиция.x = ((событие.clientX + window.pageXOffset) / ширина ) * 2 - 1;
позиция.y = - ((событие.clientY + window.pageYOffset) / высота) * 2 + 1;
мир.позицияНажатия = позиция;
мир.уведомить("нажали");
};
// // // //
фишкуМожноВыбрать = (индексы, индекс) =>
{
var позиция = позицияИндексаФишки(индекс);