Compare commits
16 Commits
1d2caf9d74
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f22b9dccb | ||
|
|
5e3f0f8a6c | ||
|
|
536550bace | ||
|
|
6fdf234a2c | ||
|
|
7a08280b29 | ||
|
|
d4eb1e7646 | ||
|
|
e7311d492b | ||
|
|
e6e3e7e202 | ||
|
|
10b486d62d | ||
|
|
6f7a8d0151 | ||
|
|
bda0fcacc8 | ||
|
|
6d41301b20 | ||
|
|
de1b2f20cc | ||
|
|
3a1ca7d11e | ||
|
|
f910244315 | ||
|
|
512806be72 |
@@ -1,5 +1,4 @@
|
||||
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
|
||||
const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts";
|
||||
|
||||
// // // //
|
||||
|
||||
@@ -13,21 +12,11 @@ const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладк
|
||||
// // // //
|
||||
|
||||
|
||||
ЗадатьОтладочнуюТемуФишекДляЗагрузки = мир =>
|
||||
ЗагрузитьВыбраннуюРаскладку = мир =>
|
||||
{
|
||||
мир.темаФишек = "отладочная|debug";
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ЗагрузитьОтладочнуюРаскладку = мир =>
|
||||
{
|
||||
var модуль = мир.модули.модульПоИмени(ИМЯ_ОТЛ_РАСКЛАДКИ);
|
||||
var ресурс = "/успех|success.layout";
|
||||
//var ресурс = "/провал|failure.layout";
|
||||
var содержимое = модуль.содержимое[ресурс];
|
||||
var детали = мир.реестрРаскладок[мир.выбраннаяРаскладка];
|
||||
var модуль = мир.модули.модульПоИмени(детали["🗿"]);
|
||||
var содержимое = модуль.содержимое[детали["📁"]];
|
||||
мир.раскладкаKMahjongg = {
|
||||
"содержимое": содержимое,
|
||||
};
|
||||
|
||||
@@ -1,10 +1,6 @@
|
||||
надо загрузить ресурсы сцены
|
||||
загрузить фишку
|
||||
загрузили фишку
|
||||
загрузить отладочную раскладку
|
||||
разобрать раскладку KMahjongg
|
||||
разобрали раскладку KMahjongg
|
||||
задать отладочную тему фишек для загрузки
|
||||
загрузить тему фишек маджонга
|
||||
загрузили тему фишек маджонга
|
||||
уведомить о загрузке ресурсов сцены
|
||||
153
пуск|run.js
153
пуск|run.js
@@ -3,6 +3,75 @@
|
||||
// // // //
|
||||
|
||||
|
||||
ВыбратьТемуФишекОтладочную = мир =>
|
||||
{
|
||||
мир.выбраннаяТема = "отладочная|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
|
||||
@@ -13,35 +82,22 @@
|
||||
// // // //
|
||||
|
||||
|
||||
ОтслеживатьНажатияПальцем = мир =>
|
||||
ПодготовитьсяКОтслеживаниюНажатий = мир =>
|
||||
{
|
||||
мир.отслеживатьНажатия = false;
|
||||
|
||||
// Палец.
|
||||
window.addEventListener(
|
||||
"touchstart",
|
||||
function(событие) {
|
||||
var позиция = new THREE.Vector2();
|
||||
позиция.x = (событие.touches[0].clientX / window.innerWidth) * 2 - 1;
|
||||
позиция.y = - (событие.touches[0].clientY / window.innerHeight) * 2 + 1;
|
||||
мир.позицияНажатия = позиция;
|
||||
мир.уведомить("нажали");
|
||||
сообщитьОНажатии(мир, событие.touches[0]);
|
||||
}
|
||||
);
|
||||
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ОтслеживатьНажатияМышью = мир =>
|
||||
{
|
||||
// Мышь.
|
||||
window.addEventListener(
|
||||
"click",
|
||||
function(событие) {
|
||||
var позиция = new THREE.Vector2();
|
||||
позиция.x = (событие.clientX / window.innerWidth) * 2 - 1;
|
||||
позиция.y = - (событие.clientY / window.innerHeight) * 2 + 1;
|
||||
мир.позицияНажатия = позиция;
|
||||
мир.уведомить("нажали");
|
||||
сообщитьОНажатии(мир, событие);
|
||||
}
|
||||
);
|
||||
};
|
||||
@@ -88,9 +144,9 @@
|
||||
// // // //
|
||||
|
||||
|
||||
СоздатьФишкиВСцене = мир =>
|
||||
РазобратьРаскладкуKMahjongg = мир =>
|
||||
{
|
||||
мир.уведомить("надо создать фишки в сцене");
|
||||
мир.раскладкаKMahjongg.позиции = разобратьРаскладкуKMahjongg(мир.раскладкаKMahjongg.содержимое);
|
||||
};
|
||||
|
||||
|
||||
@@ -109,7 +165,7 @@
|
||||
ПодготовитьСцену = мир =>
|
||||
{
|
||||
var коэффициент = 2;
|
||||
var расстояние = 6;
|
||||
var расстояние = 14;
|
||||
мир.камера.position.y = расстояние * коэффициент;
|
||||
мир.камера.position.z = расстояние;
|
||||
мир.камера.lookAt(new THREE.Vector3(0, 0, 0));
|
||||
@@ -117,9 +173,6 @@
|
||||
мир.свет = new THREE.DirectionalLight(0xffffff, 1);
|
||||
мир.свет.position.set(-0.5, 1, 0.5).normalize();
|
||||
мир.сцена.add(мир.свет);
|
||||
|
||||
мир.корень = new THREE.Group();
|
||||
мир.сцена.add(мир.корень);
|
||||
};
|
||||
|
||||
|
||||
@@ -140,3 +193,51 @@
|
||||
мир.загрузчик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;
|
||||
};
|
||||
|
||||
|
||||
@@ -1,20 +1,29 @@
|
||||
пуск модулей маджонга
|
||||
создать масштаб
|
||||
создать канву ThreeJS
|
||||
настроить ThreeJS
|
||||
встроить отрисовщика ThreeJS
|
||||
отслеживать изменение размера окна браузера
|
||||
изменить размер отрисовщика ThreeJS
|
||||
создать загрузчик GLTF
|
||||
создать загрузчик текстур
|
||||
подготовить сцену
|
||||
загрузить ресурсы сцены
|
||||
загрузили ресурсы сцены
|
||||
создать фишки в сцене
|
||||
создали фишки в сцене
|
||||
центрировать сцену
|
||||
отслеживать нажатия мышью
|
||||
отслеживать нажатия пальцем
|
||||
подготовиться к отслеживанию нажатий
|
||||
исправить отслеживание нажатий на IOS
|
||||
запустить отрисовку
|
||||
выбрать тему фишек отладочную
|
||||
загрузить ресурсы сцены
|
||||
загрузили ресурсы сцены
|
||||
выбрать раскладку X
|
||||
подготовиться к созданию фишек в сцене
|
||||
включить отслеживание нажатий
|
||||
|
||||
изменили размер окна браузера
|
||||
изменить размер отрисовщика ThreeJS
|
||||
изменили масштаб
|
||||
изменить размер отрисовщика ThreeJS
|
||||
|
||||
выбрали раскладку
|
||||
загрузить выбранную раскладку
|
||||
разобрать раскладку KMahjongg
|
||||
создать фишки в сцене
|
||||
центрировать сцену
|
||||
160
фишки|tiles.js
160
фишки|tiles.js
@@ -3,6 +3,33 @@
|
||||
// // // //
|
||||
|
||||
|
||||
ВывестиКоординатыНажатия = мир =>
|
||||
{
|
||||
console.debug("Координаты нажатия:", мир.позицияНажатия.x, мир.позицияНажатия.y);
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
УведомитьОПоражении = мир =>
|
||||
{
|
||||
мир.уведомить("поражение");
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
УведомитьОПобеде = мир =>
|
||||
{
|
||||
мир.уведомить("победа");
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ВывестиПобеду = мир =>
|
||||
{
|
||||
console.debug("ПОБЕДА");
|
||||
@@ -92,8 +119,7 @@
|
||||
{
|
||||
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||||
{
|
||||
var фишка = мир.индексыФишек[индекс];
|
||||
var номер = номерФишки(мир.фишки, фишка.id);
|
||||
var номер = мир.индексыФишек[индекс];
|
||||
мир.доступныеДляВыбораНомераФишек.push(номер);
|
||||
}
|
||||
}
|
||||
@@ -331,6 +357,7 @@
|
||||
console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
@@ -346,6 +373,17 @@
|
||||
|
||||
ПроверитьДоступностьФишкиДляВыбора = мир =>
|
||||
{
|
||||
// Удостоверимся, что это не одна и та же фишка, выбранная дважды.
|
||||
if (мир.номераВыбранныхФишек.length)
|
||||
{
|
||||
var номер = мир.номераВыбранныхФишек[0];
|
||||
if (номер == мир.номерНайденнойФишки)
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Проверяем доступность с точки зрения правил Маджонга.
|
||||
var позиция = мир.раскладкаKMahjongg.позиции[мир.номерНайденнойФишки];
|
||||
var индекс = индексПозицииФишки(позиция);
|
||||
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||||
@@ -358,41 +396,6 @@
|
||||
// // // //
|
||||
|
||||
|
||||
УведомитьОСозданииФишекВСцене = мир =>
|
||||
{
|
||||
мир.уведомить("создали фишки в сцене");
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ПодготовитьФишкиКВыбору = мир =>
|
||||
{
|
||||
мир.номераВыбранныхФишек = [];
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
СоздатьИндексыФишек = мир =>
|
||||
{
|
||||
мир.индексыФишек = {};
|
||||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||
for (var номер in позиции)
|
||||
{
|
||||
var позиция = позиции[номер];
|
||||
var фишка = мир.фишки[номер];
|
||||
var индекс = индексПозицииФишки(позиция);
|
||||
мир.индексыФишек[индекс] = фишка;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ВывестиНайденнуюФишку = мир =>
|
||||
{
|
||||
var номер = мир.номерНайденнойФишки;
|
||||
@@ -418,31 +421,31 @@
|
||||
мир.уведомить("нашли фишку в координатах нажатия");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
|
||||
ПодготовитьФишкиКВыбору = мир =>
|
||||
{
|
||||
мир.материалыВыбранныхФишек = [];
|
||||
for (var номер in мир.материалыФишек)
|
||||
{
|
||||
var материал = мир.материалыФишек[номер].clone();
|
||||
материал.color = new THREE.Color(0xff0000);
|
||||
мир.материалыВыбранныхФишек.push(материал);
|
||||
}
|
||||
мир.номераВыбранныхФишек = [];
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ПодготовитьПоискФишек = мир =>
|
||||
СоздатьИндексыФишек = мир =>
|
||||
{
|
||||
мир.номераНайденныхФишек = [];
|
||||
мир.индексыФишек = {};
|
||||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||
for (var номер in позиции)
|
||||
{
|
||||
var позиция = позиции[номер];
|
||||
var индекс = индексПозицииФишки(позиция);
|
||||
мир.индексыФишек[индекс] = номер;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -495,7 +498,11 @@
|
||||
var размеры = [
|
||||
(границы.max.x - границы.min.x) / 2,
|
||||
(границы.max.z - границы.min.z) / 2,
|
||||
границы.max.y - границы.min.y,
|
||||
//границы.max.y - границы.min.y,
|
||||
];
|
||||
var отступы = [
|
||||
0.02,
|
||||
0.02,
|
||||
];
|
||||
|
||||
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||
@@ -511,8 +518,8 @@
|
||||
var слой = позиция[0];
|
||||
var ряд = позиция[1];
|
||||
var столбец = позиция[2];
|
||||
фишка.position.x = столбец * размеры[0];
|
||||
фишка.position.z = ряд * размеры[1];
|
||||
фишка.position.x = столбец * (размеры[0] + отступы[0]);
|
||||
фишка.position.z = ряд * (размеры[1] + отступы[1]);
|
||||
фишка.position.y = слой;
|
||||
}
|
||||
};
|
||||
@@ -521,14 +528,61 @@
|
||||
// // // //
|
||||
|
||||
|
||||
ПодготовитьКореньФишек = мир =>
|
||||
{
|
||||
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(материал);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
СоздатьФишкиВСцене = мир =>
|
||||
{
|
||||
мир.уведомить("надо создать фишки в сцене");
|
||||
};
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
ПодготовитьсяКСозданиюФишекВСцене = мир =>
|
||||
{
|
||||
мир.уведомить("надо подготовиться к созданию фишек в сцене");
|
||||
};
|
||||
|
||||
|
||||
@@ -1,17 +1,20 @@
|
||||
надо создать фишки в сцене
|
||||
надо подготовиться к созданию фишек в сцене
|
||||
создать материалы фишек отладочной темы
|
||||
создать материалы выбранных фишек отладочной темы
|
||||
|
||||
надо создать фишки в сцене
|
||||
подготовить корень фишек
|
||||
создать узлы фишек
|
||||
создать группы фишек
|
||||
задать материалы фишкам по группам
|
||||
создать материалы выбранных фишек отладочной темы
|
||||
создать индексы фишек
|
||||
подготовить фишки к выбору
|
||||
уведомить о создании фишек в сцене
|
||||
включить возможность поиска фишки
|
||||
|
||||
нажали
|
||||
проверить возможность поиска фишки
|
||||
можно искать фишку
|
||||
# вывести координаты нажатия
|
||||
найти фишку в координатах нажатия
|
||||
нашли фишку в координатах нажатия
|
||||
вывести найденную фишку
|
||||
@@ -50,5 +53,7 @@
|
||||
проверить наличие фишек на игровом поле
|
||||
фишки на игровом поле присутствуют
|
||||
вывести поражение
|
||||
уведомить о поражении
|
||||
фишки на игровом поле отсутствуют
|
||||
вывести победу
|
||||
уведомить о победе
|
||||
@@ -1,5 +1,28 @@
|
||||
|
||||
|
||||
// // // //
|
||||
|
||||
|
||||
сообщитьОНажатии = (мир, событие) =>
|
||||
{
|
||||
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 позиция = позицияИндексаФишки(индекс);
|
||||
@@ -50,8 +73,8 @@
|
||||
|
||||
позицияИндексаФишки = (индекс) =>
|
||||
{
|
||||
const x = индекс / 1000000;
|
||||
const y = (индекс - x * 1000000) / 1000;
|
||||
const x = Math.round(индекс / 1000000);
|
||||
const y = Math.round((индекс - x * 1000000) / 1000);
|
||||
const z = индекс - x * 1000000 - y * 1000;
|
||||
return [x, y, z];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user