@@ -2,7 +2,9 @@ | |||
1.0.0 | |||
https://git.opengamestudio.org/mahjong/mahjong-scena | |||
/загрузка|loading.js | |||
x /загрузка|loading.js | |||
/загрузка|loading.череда | |||
x /пуск|run.js | |||
/пуск|run.череда | |||
/пуск|run.череда | |||
x /фишки|tiles.js | |||
/фишки|tiles.череда |
@@ -1,11 +1,12 @@ | |||
const ИМЯ_МОДУЛЯ_РЕСУРСОВ = "Ресурсы Маджонга | Mahjong resources"; | |||
const ИМЯ_ОТЛ_РАСКЛАДКИ = "Отладочные раскладки Маджонга | Mahjong debug layouts"; | |||
// // // // | |||
УведомитьОбОкончанииЗагрузок = мир => | |||
УведомитьОЗагрузкеРесурсовСцены = мир => | |||
{ | |||
мир.уведомить("окончили загрузки"); | |||
мир.уведомить("загрузили ресурсы сцены"); | |||
}; | |||
@@ -1,11 +1,10 @@ | |||
подготовили сцену | |||
надо загрузить ресурсы сцены | |||
загрузить фишку | |||
загрузили фишку | |||
# загрузить раскладку | |||
загрузить отладочную раскладку | |||
разобрать раскладку KMahjongg | |||
разобрали раскладку KMahjongg | |||
задать отладочную тему фишек для загрузки | |||
загрузить тему фишек маджонга | |||
загрузили тему фишек маджонга | |||
уведомить об окончании загрузок | |||
уведомить о загрузке ресурсов сцены |
@@ -3,6 +3,109 @@ | |||
// // // // | |||
ИсправитьОтслеживаниеНажатийНа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; | |||
@@ -17,8 +120,6 @@ | |||
мир.корень = new THREE.Group(); | |||
мир.сцена.add(мир.корень); | |||
мир.уведомить("подготовили сцену"); | |||
}; | |||
@@ -6,6 +6,15 @@ | |||
создать загрузчик GLTF | |||
создать загрузчик текстур | |||
подготовить сцену | |||
загрузить ресурсы сцены | |||
загрузили ресурсы сцены | |||
создать фишки в сцене | |||
создали фишки в сцене | |||
центрировать сцену | |||
отслеживать нажатия мышью | |||
отслеживать нажатия пальцем | |||
исправить отслеживание нажатий на IOS | |||
запустить отрисовку | |||
изменили размер окна браузера | |||
изменить размер отрисовщика ThreeJS |
@@ -0,0 +1,180 @@ | |||
// // // // | |||
УведомитьОСозданииФишекВСцене = мир => | |||
{ | |||
мир.уведомить("создали фишки в сцене"); | |||
}; | |||
// // // // | |||
ОкраситьВыбранныеФишки = мир => | |||
{ | |||
// Очищаем цвета всех фишек. | |||
for (var номер in мир.фишки) | |||
{ | |||
var фишка = мир.фишки[номер]; | |||
var группа = мир.группыФишек[номер]; | |||
var материал = мир.материалыФишек[группа]; | |||
фишка.material = материал; | |||
} | |||
// Окрашиваем выбранные фишки. | |||
for (var id in мир.номераВыбранныхФишек) | |||
{ | |||
var номер = мир.номераВыбранныхФишек[id]; | |||
var фишка = мир.фишки[номер]; | |||
var группа = мир.группыФишек[номер]; | |||
var материал = мир.материалыВыбранныхФишек[группа]; | |||
фишка.material = материал; | |||
} | |||
}; | |||
// // // // | |||
ВывестиВыбранныеФишки = мир => | |||
{ | |||
var номер = мир.номерВыбраннойФишки; | |||
var группа = мир.группыФишек[номер]; | |||
console.debug(`Выбрали фишку. номер: '${номер}' группа: '${группа}'`); | |||
console.debug("Номера выбранных фишек", мир.номераВыбранныхФишек); | |||
}; | |||
// // // // | |||
ВыбратьФишкуВКоординатахНажатия = мир => | |||
{ | |||
мир.ловецНажатий.setFromCamera(мир.позицияНажатия, мир.камера); | |||
var пересечения = мир.ловецНажатий.intersectObjects(мир.корень.children); | |||
if (пересечения.length) | |||
{ | |||
var фишка = пересечения[0].object; | |||
var номер = номерФишки(мир.фишки, фишка.id); | |||
if (номер) | |||
{ | |||
мир.номерВыбраннойФишки = номер; | |||
мир.номераВыбранныхФишек.push(номер); | |||
мир.уведомить("выбор фишки"); | |||
} | |||
} | |||
}; | |||
// // // // | |||
СоздатьМатериалыВыбранныхФишекОтладочнойТемы = мир => | |||
{ | |||
мир.материалыВыбранныхФишек = []; | |||
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(материал); | |||
} | |||
}; |
@@ -0,0 +1,14 @@ | |||
надо создать фишки в сцене | |||
создать материалы фишек отладочной темы | |||
создать узлы фишек | |||
создать группы фишек | |||
задать материалы фишкам по группам | |||
подготовить выбор фишек | |||
создать материалы выбранных фишек отладочной темы | |||
уведомить о создании фишек в сцене | |||
нажали | |||
выбрать фишку в координатах нажатия | |||
выбор фишки | |||
вывести выбранные фишки | |||
окрасить выбранные фишки |