Compare commits

...

19 Commits

Author SHA1 Message Date
Главред | Glavred
1d2caf9d74 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 18:24:16 +03:00
Главред | Glavred
164ddbb896 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 15:26:37 +03:00
Главред | Glavred
bddc7075a0 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 15:25:29 +03:00
Главред | Glavred
c29a00c327 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 15:24:28 +03:00
Главред | Glavred
e10d402ed3 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 15:23:50 +03:00
Главред | Glavred
bed828e0b8 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-22 15:22:34 +03:00
Главред | Glavred
804aa6dc8d Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-21 15:01:40 +03:00
Главред | Glavred
797f6bef17 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-18 15:05:50 +03:00
Главред | Glavred
bc55dd6962 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-17 17:18:01 +03:00
Главред | Glavred
3781916cf9 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-17 16:44:01 +03:00
Главред | Glavred
b7de06d515 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-17 16:42:22 +03:00
Главред | Glavred
268cba8466 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-15 15:31:00 +03:00
Главред | Glavred
57c42f7aa9 Изменения от Главреда ГитЖС | Changes of GitJS Glavred 2020-09-15 15:10:55 +03:00
d83398fbfc Изменить название | Rename 2020-09-15 14:06:09 +02:00
925b8602e8 Оставить минимум | Leave only the minimum 2020-08-17 17:12:18 +03:00
d1832a9937 Изменения от isomorphic-git 2020-07-15 15:29:48 +03:00
a7ec44ca8c Изменения от isomorphic-git 2020-07-15 14:29:18 +03:00
a093d3d04b Изменения от isomorphic-git 2020-07-15 14:29:11 +03:00
d287525c3d Изменения от isomorphic-git 2020-07-14 19:16:41 +03:00
10 changed files with 917 additions and 10 deletions

12
0000
View File

@@ -1,5 +1,11 @@
Привет
СМ | MS
1.0.0
https://git.opengamestudio.org/mahjong/mahjong-scena
/привет.череда
x /привет.js
x /загрузка|loading.js
/загрузка|loading.череда
x /пуск|run.js
/пуск|run.череда
x /фишки|tiles.js
/фишки|tiles.череда
x /функции|functions.js

View File

@@ -0,0 +1,65 @@
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources";
const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts";
// // // //
УведомитьОЗагрузкеРесурсовСцены = мир =>
{
мир.уведомить("загрузили ресурсы сцены");
};
// // // //
ЗадатьОтладочнуюТемуФишекДляЗагрузки = мир =>
{
мир.темаФишек = "отладочная|debug";
};
// // // //
ЗагрузитьОтладочнуюРаскладку = мир =>
{
var модуль = мир.модули.модульПоИмени(ИМЯ_ОТЛ_РАСКЛАДКИ);
var ресурс = "/успех|success.layout";
//var ресурс = "/провал|failure.layout";
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);
}
);
};

View File

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

View File

@@ -1,5 +0,0 @@
ПоприветствоватьМир = function()
{
console.log("Привет, мир!");
document.body.innerHTML = "<h1>Привет, мир!</h1>";
};

View File

@@ -1,2 +0,0 @@
пуск
поприветствовать мир

142
пуск|run.js Normal file
View File

@@ -0,0 +1,142 @@
// // // //
ИсправитьОтслеживаниеНажатийНа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;
мир.позицияНажатия = позиция;
мир.уведомить("нажали");
}
);
};
// // // //
ЦентрироватьСцену = мир =>
{
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 коэффициент = 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(мир.корень);
};
// // // //
СоздатьЗагрузчикТекстур = мир =>
{
мир.загрузчикТекстур = new THREE.TextureLoader();
};
// // // //
СоздатьЗагрузчикGLTF = мир =>
{
мир.загрузчикGLTF = new THREE.GLTFLoader();
};

20
пуск|run.череда Normal file
View File

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

534
фишки|tiles.js Normal file
View File

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

View File

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

View File

@@ -0,0 +1,83 @@
фишкуМожноВыбрать = (индексы, индекс) =>
{
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 = индекс / 1000000;
const y = (индекс - 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;
};