Compare commits
35 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f22b9dccb | ||
|
|
5e3f0f8a6c | ||
|
|
536550bace | ||
|
|
6fdf234a2c | ||
|
|
7a08280b29 | ||
|
|
d4eb1e7646 | ||
|
|
e7311d492b | ||
|
|
e6e3e7e202 | ||
|
|
10b486d62d | ||
|
|
6f7a8d0151 | ||
|
|
bda0fcacc8 | ||
|
|
6d41301b20 | ||
|
|
de1b2f20cc | ||
|
|
3a1ca7d11e | ||
|
|
f910244315 | ||
|
|
512806be72 | ||
|
|
1d2caf9d74 | ||
|
|
164ddbb896 | ||
|
|
bddc7075a0 | ||
|
|
c29a00c327 | ||
|
|
e10d402ed3 | ||
|
|
bed828e0b8 | ||
|
|
804aa6dc8d | ||
|
|
797f6bef17 | ||
|
|
bc55dd6962 | ||
|
|
3781916cf9 | ||
|
|
b7de06d515 | ||
|
|
268cba8466 | ||
|
|
57c42f7aa9 | ||
| d83398fbfc | |||
| 925b8602e8 | |||
| d1832a9937 | |||
| a7ec44ca8c | |||
| a093d3d04b | |||
| d287525c3d |
12
0000
12
0000
@@ -1,5 +1,11 @@
|
|||||||
Привет
|
СМ | MS
|
||||||
1.0.0
|
1.0.0
|
||||||
|
https://git.opengamestudio.org/mahjong/mahjong-scena
|
||||||
|
|
||||||
/привет.череда
|
x /загрузка|loading.js
|
||||||
x /привет.js
|
/загрузка|loading.череда
|
||||||
|
x /пуск|run.js
|
||||||
|
/пуск|run.череда
|
||||||
|
x /фишки|tiles.js
|
||||||
|
/фишки|tiles.череда
|
||||||
|
x /функции|functions.js
|
||||||
54
загрузка|loading.js
Normal file
54
загрузка|loading.js
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
УведомитьОЗагрузкеРесурсовСцены = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("загрузили ресурсы сцены");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЗагрузитьВыбраннуюРаскладку = мир =>
|
||||||
|
{
|
||||||
|
var детали = мир.реестрРаскладок[мир.выбраннаяРаскладка];
|
||||||
|
var модуль = мир.модули.модульПоИмени(детали["🗿"]);
|
||||||
|
var содержимое = модуль.содержимое[детали["📁"]];
|
||||||
|
мир.раскладкаKMahjongg = {
|
||||||
|
"содержимое": содержимое,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЗагрузитьФишку = мир =>
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
6
загрузка|loading.череда
Normal file
6
загрузка|loading.череда
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
надо загрузить ресурсы сцены
|
||||||
|
загрузить фишку
|
||||||
|
загрузили фишку
|
||||||
|
загрузить тему фишек маджонга
|
||||||
|
загрузили тему фишек маджонга
|
||||||
|
уведомить о загрузке ресурсов сцены
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
ПоприветствоватьМир = function()
|
|
||||||
{
|
|
||||||
console.log("Привет, мир!");
|
|
||||||
document.body.innerHTML = "<h1>Привет, мир!</h1>";
|
|
||||||
};
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
пуск
|
|
||||||
поприветствовать мир
|
|
||||||
243
пуск|run.js
Normal file
243
пуск|run.js
Normal file
@@ -0,0 +1,243 @@
|
|||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВыбратьТемуФишекОтладочную = мир =>
|
||||||
|
{
|
||||||
|
мир.выбраннаяТема = "отладочная|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
|
||||||
|
мир.отрисовщик.domElement.style.cursor = "pointer";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПодготовитьсяКОтслеживаниюНажатий = мир =>
|
||||||
|
{
|
||||||
|
мир.отслеживатьНажатия = false;
|
||||||
|
|
||||||
|
// Палец.
|
||||||
|
window.addEventListener(
|
||||||
|
"touchstart",
|
||||||
|
function(событие) {
|
||||||
|
сообщитьОНажатии(мир, событие.touches[0]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
// Мышь.
|
||||||
|
window.addEventListener(
|
||||||
|
"click",
|
||||||
|
function(событие) {
|
||||||
|
сообщитьОНажатии(мир, событие);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЦентрироватьСцену = мир =>
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
РазобратьРаскладкуKMahjongg = мир =>
|
||||||
|
{
|
||||||
|
мир.раскладкаKMahjongg.позиции = разобратьРаскладкуKMahjongg(мир.раскладкаKMahjongg.содержимое);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЗагрузитьРесурсыСцены = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("надо загрузить ресурсы сцены");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПодготовитьСцену = мир =>
|
||||||
|
{
|
||||||
|
var коэффициент = 2;
|
||||||
|
var расстояние = 14;
|
||||||
|
мир.камера.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.TextureLoader();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СоздатьЗагрузчикGLTF = мир =>
|
||||||
|
{
|
||||||
|
мир.загрузчик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;
|
||||||
|
};
|
||||||
|
|
||||||
29
пуск|run.череда
Normal file
29
пуск|run.череда
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
пуск модулей маджонга
|
||||||
|
создать масштаб
|
||||||
|
создать канву ThreeJS
|
||||||
|
настроить ThreeJS
|
||||||
|
отслеживать изменение размера окна браузера
|
||||||
|
изменить размер отрисовщика ThreeJS
|
||||||
|
создать загрузчик GLTF
|
||||||
|
создать загрузчик текстур
|
||||||
|
подготовить сцену
|
||||||
|
подготовиться к отслеживанию нажатий
|
||||||
|
исправить отслеживание нажатий на IOS
|
||||||
|
запустить отрисовку
|
||||||
|
выбрать тему фишек отладочную
|
||||||
|
загрузить ресурсы сцены
|
||||||
|
загрузили ресурсы сцены
|
||||||
|
выбрать раскладку X
|
||||||
|
подготовиться к созданию фишек в сцене
|
||||||
|
включить отслеживание нажатий
|
||||||
|
|
||||||
|
изменили размер окна браузера
|
||||||
|
изменить размер отрисовщика ThreeJS
|
||||||
|
изменили масштаб
|
||||||
|
изменить размер отрисовщика ThreeJS
|
||||||
|
|
||||||
|
выбрали раскладку
|
||||||
|
загрузить выбранную раскладку
|
||||||
|
разобрать раскладку KMahjongg
|
||||||
|
создать фишки в сцене
|
||||||
|
центрировать сцену
|
||||||
588
фишки|tiles.js
Normal file
588
фишки|tiles.js
Normal file
@@ -0,0 +1,588 @@
|
|||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиКоординатыНажатия = мир =>
|
||||||
|
{
|
||||||
|
console.debug("Координаты нажатия:", мир.позицияНажатия.x, мир.позицияНажатия.y);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
УведомитьОПоражении = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("поражение");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
УведомитьОПобеде = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("победа");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиПобеду = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ПОБЕДА");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиПоражение = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ПОРАЖЕНИЕ");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПроверитьНаличиеФишекНаИгровомПоле = мир =>
|
||||||
|
{
|
||||||
|
if (Object.keys(мир.индексыФишек).length > 0)
|
||||||
|
{
|
||||||
|
мир.уведомить("фишки на игровом поле присутствуют");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
мир.уведомить("фишки на игровом поле отсутствуют");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиПрисутствиеХодов = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ходы есть");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиОтсутствиеХодов = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ходов нет");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПроверитьНаличиеХодов = мир =>
|
||||||
|
{
|
||||||
|
var номера = мир.доступныеДляВыбораНомераФишек;
|
||||||
|
for (var н0 in номера)
|
||||||
|
{
|
||||||
|
for (var н1 in номера)
|
||||||
|
{
|
||||||
|
// Пропускаем одну и ту же фишку.
|
||||||
|
if (н0 == н1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var номер0 = номера[н0];
|
||||||
|
var номер1 = номера[н1];
|
||||||
|
var группа0 = мир.группыФишек[номер0];
|
||||||
|
var группа1 = мир.группыФишек[номер1];
|
||||||
|
if (группа0 == группа1)
|
||||||
|
{
|
||||||
|
мир.уведомить("ходы присутствуют");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
мир.уведомить("ходы отсутствуют");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СобратьДоступныеДляВыбораНомераФишек = мир =>
|
||||||
|
{
|
||||||
|
мир.доступныеДляВыбораНомераФишек = [];
|
||||||
|
for (индекс in мир.индексыФишек)
|
||||||
|
{
|
||||||
|
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||||||
|
{
|
||||||
|
var номер = мир.индексыФишек[индекс];
|
||||||
|
мир.доступныеДляВыбораНомераФишек.push(номер);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЗапуститьПлавноеСкрытиеФишек = мир =>
|
||||||
|
{
|
||||||
|
var шаг = 10;
|
||||||
|
var длительность = 200;
|
||||||
|
var прозрачность = 1.0;
|
||||||
|
var дельтаПрозрачности = шаг / длительность;
|
||||||
|
const анимация = setInterval(
|
||||||
|
function() {
|
||||||
|
прозрачность -= дельтаПрозрачности;
|
||||||
|
// Возвращаем прозрачность материалам перед последующим скрытием фишек.
|
||||||
|
// И планируем выход из этой анимации.
|
||||||
|
var выходим = false;
|
||||||
|
if (прозрачность < 0)
|
||||||
|
{
|
||||||
|
прозрачность = 1;
|
||||||
|
выходим = true;
|
||||||
|
}
|
||||||
|
// Выставляем нужную прозрачность.
|
||||||
|
for (var id in мир.номераВыбранныхФишек)
|
||||||
|
{
|
||||||
|
var номер = мир.номераВыбранныхФишек[id];
|
||||||
|
var фишка = мир.фишки[номер];
|
||||||
|
фишка.material.opacity = прозрачность;
|
||||||
|
// Указываем на необходимость учитывать прозрачность.
|
||||||
|
фишка.material.transparent = true;
|
||||||
|
}
|
||||||
|
if (выходим)
|
||||||
|
{
|
||||||
|
clearInterval(анимация);
|
||||||
|
мир.уведомить("плавно скрыли фишки");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
шаг
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПроверитьВозможностьПоискаФишки = мир =>
|
||||||
|
{
|
||||||
|
if (мир.можноИскатьФишку)
|
||||||
|
{
|
||||||
|
мир.уведомить("можно искать фишку");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОтключитьВозможностьПоискаФишки = мир =>
|
||||||
|
{
|
||||||
|
мир.можноИскатьФишку = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВключитьВозможностьПоискаФишки = мир =>
|
||||||
|
{
|
||||||
|
мир.можноИскатьФишку = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // /
|
||||||
|
|
||||||
|
|
||||||
|
ПростоОбождатьПаруСекунд = мир =>
|
||||||
|
{
|
||||||
|
setTimeout(
|
||||||
|
function() {
|
||||||
|
мир.уведомить("плавно скрыли фишки")
|
||||||
|
},
|
||||||
|
2000
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПлавноСкрытьФишки = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("надо плавно скрыть фишки");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОчиститьВыборФишек = мир =>
|
||||||
|
{
|
||||||
|
мир.номераВыбранныхФишек = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОчиститьИндексыВыбранныхФишек = мир =>
|
||||||
|
{
|
||||||
|
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||||
|
for (var id in мир.номераВыбранныхФишек)
|
||||||
|
{
|
||||||
|
var номер = мир.номераВыбранныхФишек[id];
|
||||||
|
var позиция = позиции[номер];
|
||||||
|
var индекс = индексПозицииФишки(позиция);
|
||||||
|
delete мир.индексыФишек[индекс];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СкрытьСовпадающиеФишки = мир =>
|
||||||
|
{
|
||||||
|
for (var id in мир.номераВыбранныхФишек)
|
||||||
|
{
|
||||||
|
var номер = мир.номераВыбранныхФишек[id];
|
||||||
|
// Перемещаем фишку на другой слой для исключения её из:
|
||||||
|
// * цикла отрисовки;
|
||||||
|
// * узлов для выбора нажатием.
|
||||||
|
мир.фишки[номер].layers.set(1);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОчиститьВыборПервойНайденнойФишки = мир =>
|
||||||
|
{
|
||||||
|
мир.номераВыбранныхФишек.shift();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОчиститьОкрашиваниеПервойНайденнойФишки = мир =>
|
||||||
|
{
|
||||||
|
var номер = мир.номераВыбранныхФишек[0];
|
||||||
|
var фишка = мир.фишки[номер];
|
||||||
|
var группа = мир.группыФишек[номер];
|
||||||
|
var материал = мир.материалыФишек[группа];
|
||||||
|
фишка.material = материал;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиРазличиеФишек = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ВывестиРазличиеФишек");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиСовпадениеФишек = мир =>
|
||||||
|
{
|
||||||
|
console.debug("ВывестиСовпадениеФишек");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СравнитьВыбранныеФишки = мир =>
|
||||||
|
{
|
||||||
|
var номер0 = мир.номераВыбранныхФишек[0];
|
||||||
|
var группа0 = мир.группыФишек[номер0];
|
||||||
|
|
||||||
|
var номер1 = мир.номераВыбранныхФишек[1];
|
||||||
|
var группа1 = мир.группыФишек[номер1];
|
||||||
|
|
||||||
|
if (группа0 == группа1)
|
||||||
|
{
|
||||||
|
мир.уведомить("фишки совпадают");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
мир.уведомить("фишки не совпадают");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПроверитьНаличиеДвухВыбранныхФишек = мир =>
|
||||||
|
{
|
||||||
|
if (мир.номераВыбранныхФишек.length == 2)
|
||||||
|
{
|
||||||
|
мир.уведомить("выбраны две фишки");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ОкраситьНайденнуюФишку = мир =>
|
||||||
|
{
|
||||||
|
var номер = мир.номерНайденнойФишки;
|
||||||
|
var фишка = мир.фишки[номер];
|
||||||
|
var группа = мир.группыФишек[номер];
|
||||||
|
var материал = мир.материалыВыбранныхФишек[группа];
|
||||||
|
фишка.material = материал;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиВыбраннуюФишку = мир =>
|
||||||
|
{
|
||||||
|
var номер = мир.номерНайденнойФишки;
|
||||||
|
var группа = мир.группыФишек[номер];
|
||||||
|
console.debug(`ВЫБРАЛИ фишку. номер: '${номер}' группа: '${группа}'`);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВыбратьНайденнуюФишку = мир =>
|
||||||
|
{
|
||||||
|
мир.номераВыбранныхФишек.push(мир.номерНайденнойФишки);
|
||||||
|
мир.уведомить("выбрали фишку");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПроверитьДоступностьФишкиДляВыбора = мир =>
|
||||||
|
{
|
||||||
|
// Удостоверимся, что это не одна и та же фишка, выбранная дважды.
|
||||||
|
if (мир.номераВыбранныхФишек.length)
|
||||||
|
{
|
||||||
|
var номер = мир.номераВыбранныхФишек[0];
|
||||||
|
if (номер == мир.номерНайденнойФишки)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем доступность с точки зрения правил Маджонга.
|
||||||
|
var позиция = мир.раскладкаKMahjongg.позиции[мир.номерНайденнойФишки];
|
||||||
|
var индекс = индексПозицииФишки(позиция);
|
||||||
|
if (фишкуМожноВыбрать(мир.индексыФишек, индекс))
|
||||||
|
{
|
||||||
|
мир.уведомить("фишка доступна для выбора");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ВывестиНайденнуюФишку = мир =>
|
||||||
|
{
|
||||||
|
var номер = мир.номерНайденнойФишки;
|
||||||
|
var группа = мир.группыФишек[номер];
|
||||||
|
console.debug(`Нашли фишку. номер: '${номер}' группа: '${группа}'`);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
НайтиФишкуВКоординатахНажатия = мир =>
|
||||||
|
{
|
||||||
|
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера);
|
||||||
|
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children);
|
||||||
|
if (пересечения.length)
|
||||||
|
{
|
||||||
|
var фишка = пересечения[0].object;
|
||||||
|
var номер = номерФишки(мир.фишки, фишка.id);
|
||||||
|
if (номер)
|
||||||
|
{
|
||||||
|
мир.номерНайденнойФишки = номер;
|
||||||
|
мир.уведомить("нашли фишку в координатах нажатия");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПодготовитьФишкиКВыбору = мир =>
|
||||||
|
{
|
||||||
|
мир.номераВыбранныхФишек = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СоздатьИндексыФишек = мир =>
|
||||||
|
{
|
||||||
|
мир.индексыФишек = {};
|
||||||
|
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||||
|
for (var номер in позиции)
|
||||||
|
{
|
||||||
|
var позиция = позиции[номер];
|
||||||
|
var индекс = индексПозицииФишки(позиция);
|
||||||
|
мир.индексыФишек[индекс] = номер;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ЗадатьМатериалыФишкамПоГруппам = мир =>
|
||||||
|
{
|
||||||
|
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,
|
||||||
|
];
|
||||||
|
var отступы = [
|
||||||
|
0.02,
|
||||||
|
0.02,
|
||||||
|
];
|
||||||
|
|
||||||
|
const позиции = мир.раскладкаKMahjongg.позиции;
|
||||||
|
мир.фишки = [];
|
||||||
|
for (var номер in позиции)
|
||||||
|
{
|
||||||
|
// Модель.
|
||||||
|
var фишка = мир.фишка.clone();
|
||||||
|
мир.фишки.push(фишка);
|
||||||
|
мир.корень.add(фишка);
|
||||||
|
// Расположение.
|
||||||
|
var позиция = позиции[номер];
|
||||||
|
var слой = позиция[0];
|
||||||
|
var ряд = позиция[1];
|
||||||
|
var столбец = позиция[2];
|
||||||
|
фишка.position.x = столбец * (размеры[0] + отступы[0]);
|
||||||
|
фишка.position.z = ряд * (размеры[1] + отступы[1]);
|
||||||
|
фишка.position.y = слой;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПодготовитьКореньФишек = мир =>
|
||||||
|
{
|
||||||
|
if (мир.корень && мир.сцена.children.includes(мир.корень))
|
||||||
|
{
|
||||||
|
мир.сцена.remove(мир.корень);
|
||||||
|
}
|
||||||
|
мир.корень = new THREE.Group();
|
||||||
|
мир.сцена.add(мир.корень);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир =>
|
||||||
|
{
|
||||||
|
мир.материалыВыбранныхФишек = [];
|
||||||
|
for (var номер in мир.материалыФишек)
|
||||||
|
{
|
||||||
|
var материал = мир.материалыФишек[номер].clone();
|
||||||
|
материал.color = new THREE.Color(0xff0000);
|
||||||
|
мир.материалыВыбранныхФишек.push(материал);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СоздатьМатериалыФишекОтладочнойТемы = мир =>
|
||||||
|
{
|
||||||
|
мир.материалыФишек = [];
|
||||||
|
for (var номер = 1; номер <= 42; ++номер)
|
||||||
|
{
|
||||||
|
var текстура = мир.текстурыТемФишек[мир.выбраннаяТема][номер];
|
||||||
|
var материал = new THREE.MeshLambertMaterial({map: текстура});
|
||||||
|
мир.материалыФишек.push(материал);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
СоздатьФишкиВСцене = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("надо создать фишки в сцене");
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
ПодготовитьсяКСозданиюФишекВСцене = мир =>
|
||||||
|
{
|
||||||
|
мир.уведомить("надо подготовиться к созданию фишек в сцене");
|
||||||
|
};
|
||||||
|
|
||||||
59
фишки|tiles.череда
Normal file
59
фишки|tiles.череда
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
надо подготовиться к созданию фишек в сцене
|
||||||
|
создать материалы фишек отладочной темы
|
||||||
|
создать материалы выбранных фишек отладочной темы
|
||||||
|
|
||||||
|
надо создать фишки в сцене
|
||||||
|
подготовить корень фишек
|
||||||
|
создать узлы фишек
|
||||||
|
создать группы фишек
|
||||||
|
задать материалы фишкам по группам
|
||||||
|
создать индексы фишек
|
||||||
|
подготовить фишки к выбору
|
||||||
|
включить возможность поиска фишки
|
||||||
|
|
||||||
|
нажали
|
||||||
|
проверить возможность поиска фишки
|
||||||
|
можно искать фишку
|
||||||
|
# вывести координаты нажатия
|
||||||
|
найти фишку в координатах нажатия
|
||||||
|
нашли фишку в координатах нажатия
|
||||||
|
вывести найденную фишку
|
||||||
|
проверить доступность фишки для выбора
|
||||||
|
фишка доступна для выбора
|
||||||
|
выбрать найденную фишку
|
||||||
|
выбрали фишку
|
||||||
|
вывести выбранную фишку
|
||||||
|
окрасить найденную фишку
|
||||||
|
проверить наличие двух выбранных фишек
|
||||||
|
выбраны две фишки
|
||||||
|
отключить возможность поиска фишки
|
||||||
|
сравнить выбранные фишки
|
||||||
|
фишки совпадают
|
||||||
|
# вывести совпадение фишек
|
||||||
|
плавно скрыть фишки
|
||||||
|
фишки не совпадают
|
||||||
|
# вывести различие фишек
|
||||||
|
очистить окрашивание первой найденной фишки
|
||||||
|
очистить выбор первой найденной фишки
|
||||||
|
включить возможность поиска фишки
|
||||||
|
надо плавно скрыть фишки
|
||||||
|
# просто обождать пару секунд
|
||||||
|
запустить плавное скрытие фишек
|
||||||
|
плавно скрыли фишки
|
||||||
|
скрыть совпадающие фишки
|
||||||
|
очистить индексы выбранных фишек
|
||||||
|
очистить выбор фишек
|
||||||
|
собрать доступные для выбора номера фишек
|
||||||
|
проверить наличие ходов
|
||||||
|
ходы присутствуют
|
||||||
|
вывести присутствие ходов
|
||||||
|
включить возможность поиска фишки
|
||||||
|
ходы отсутствуют
|
||||||
|
вывести отсутствие ходов
|
||||||
|
проверить наличие фишек на игровом поле
|
||||||
|
фишки на игровом поле присутствуют
|
||||||
|
вывести поражение
|
||||||
|
уведомить о поражении
|
||||||
|
фишки на игровом поле отсутствуют
|
||||||
|
вывести победу
|
||||||
|
уведомить о победе
|
||||||
106
функции|functions.js
Normal file
106
функции|functions.js
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
сообщитьОНажатии = (мир, событие) =>
|
||||||
|
{
|
||||||
|
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 позиция = позицияИндексаФишки(индекс);
|
||||||
|
// Проверяем заблокированность фишки одновременно с обеих сторон.
|
||||||
|
var слева = уФишкиЕстьСоседи(индексы, позиция, 0, -2);
|
||||||
|
var справа = уФишкиЕстьСоседи(индексы, позиция, 0, 2);
|
||||||
|
if (слева && справа)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Проверяем заблокированность сверху.
|
||||||
|
for (var смещениеСтолбца = -1; смещениеСтолбца < 2; ++смещениеСтолбца)
|
||||||
|
{
|
||||||
|
if (уФишкиЕстьСоседи(индексы, позиция, 1, смещениеСтолбца))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
уФишкиЕстьСоседи = (индексы, позиция, смещениеСлоя, смещениеСтолбца) =>
|
||||||
|
{
|
||||||
|
for (var смещениеРяда = -1; смещениеРяда < 2; ++смещениеРяда)
|
||||||
|
{
|
||||||
|
var позицияСоседа = [
|
||||||
|
позиция[0] + смещениеСлоя,
|
||||||
|
позиция[1] + смещениеРяда,
|
||||||
|
позиция[2] + смещениеСтолбца,
|
||||||
|
];
|
||||||
|
var индексСоседа = индексПозицииФишки(позицияСоседа);
|
||||||
|
if (индексСоседа in индексы)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
позицияИндексаФишки = (индекс) =>
|
||||||
|
{
|
||||||
|
const x = Math.round(индекс / 1000000);
|
||||||
|
const y = Math.round((индекс - x * 1000000) / 1000);
|
||||||
|
const z = индекс - x * 1000000 - y * 1000;
|
||||||
|
return [x, y, z];
|
||||||
|
};
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
индексПозицииФишки = (позиция) =>
|
||||||
|
{
|
||||||
|
return позиция[0] * 1000000 + позиция[1] * 1000 + позиция[2];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// // // //
|
||||||
|
|
||||||
|
|
||||||
|
номерФишки = (фишки, id) =>
|
||||||
|
{
|
||||||
|
for (var номер in фишки)
|
||||||
|
{
|
||||||
|
var фишка = фишки[номер];
|
||||||
|
if (фишка.id == id)
|
||||||
|
{
|
||||||
|
return номер;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user