Files
mahjong-scena/фишки|tiles.js

590 lines
15 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// // // //
ВывестиКоординатыНажатия = мир =>
{
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(материал);
}
};
// // // //
СоздатьМатериалыФишекОтладочнойТемы = мир =>
{
мир.материалыФишек = [];
var тема = "отладочная|debug";
for (var номер = 1; номер <= 42; ++номер)
{
var текстура = мир.текстурыТемФишек[тема][номер];
var материал = new THREE.MeshLambertMaterial({map: текстура});
мир.материалыФишек.push(материал);
}
};
// // // //
СоздатьФишкиВСцене = мир =>
{
мир.уведомить("надо создать фишки в сцене");
};
// // // //
ПодготовитьсяКСозданиюФишекВСцене = мир =>
{
мир.уведомить("надо подготовиться к созданию фишек в сцене");
};