"Select object" с помощью любой клавиши.
29 октября 2016 16:14
Делаю небольшой fps проект, очень хочу реализовать выбор объекта через клавишу, то есть сэмулировать Select. Кастую луч из камеры, а как выбрать объект, попавший под луч - не знаю( Именно так нужно выбрать, чтобы Нода swith select поняла в итоге. Реализуемо ли это? Если кто знает - подскажите, пожалуйста. Поднял обсуждение в тему, так как думаю, что многим полезен будет ответ на данный вопрос.
P.S.
В примере, насколько я понял клик обрабатывает вот эта функция:
function main_canvas_click(e) {
if (e.preventDefault)
e.preventDefault();
var x = e.clientX;
var y = e.clientY;
var obj = m_scenes.pick_object(x, y);
if (obj) {
if (_previous_selected_obj) {
m_anim.stop(_previous_selected_obj);
m_anim.set_frame(_previous_selected_obj, 0);
}
_previous_selected_obj = obj;
m_anim.apply_def(obj);
m_anim.play(obj);
}
}
Но я не пойму, где в ней сам клик то обрабатывается, и как его на клавишу заменить?
P.S.
В примере, насколько я понял клик обрабатывает вот эта функция:
function main_canvas_click(e) {
if (e.preventDefault)
e.preventDefault();
var x = e.clientX;
var y = e.clientY;
var obj = m_scenes.pick_object(x, y);
if (obj) {
if (_previous_selected_obj) {
m_anim.stop(_previous_selected_obj);
m_anim.set_frame(_previous_selected_obj, 0);
}
_previous_selected_obj = obj;
m_anim.apply_def(obj);
m_anim.play(obj);
}
}
Но я не пойму, где в ней сам клик то обрабатывается, и как его на клавишу заменить?
31 октября 2016 11:52
01 ноября 2016 12:33
Я понял, что за выбор объекта вроде как pick object отвечает, но с клавишей так и не заработало(, он с canvas координатами работает же? (Короче много всего перепробовал, надеюсь поможете, а то я в ступоре)
Да, там нужны canvas-координаты. В случае с клавиатурой оптимально брать координаты центра канваса, т.е. выбор будет при непосредственном наведении на объект. Так можно и без кастования лучей сделать. Или вам нужно выбирать объекты в разных областях вьюпорта? Опишите алгоритм как это должно происходить.
Именно так нужно выбрать, чтобы Нода swith select поняла в итоге.В нодах клавиатура не поддерживается, тут придется писать код. Если все-таки есть потребность большую часть логики делать через ноды, то можно использовать ноду JS Callback для вызова скриптов там, где без них не обойтись.
01 ноября 2016 12:44
User story такой:
Смотрю на объект - жму E- объект селектится.
1) А центр формулой считать?
2) switch select разве не на выделение реагирует? Ведь название само за себя говорит. Или она не понимает то, что возвращает функция Pick Object ? (Тут 2 вопроса в одном)
Смотрю на объект - жму E- объект селектится.
Да, там нужны canvas-координаты. В случае с клавиатурой оптимально брать координаты центра канваса, т.е. выбор будет при непосредственном наведении на объект.Два вопроса:
1) А центр формулой считать?
2) switch select разве не на выделение реагирует? Ведь название само за себя говорит. Или она не понимает то, что возвращает функция Pick Object ? (Тут 2 вопроса в одном)
01 ноября 2016 12:52
Основная цель это выделить клавишей также, как и кликом, чтобы нода поняла (Чтобы логику того, что после активаци произошло нодами колдовать). Очень-очень нужно именно так сделать, или это анриал? Может закостылить как-нибудь, В крайнем случае эмулировать клик (А-я-яй), но это я тоже пробовал уже, но тоже безуспешно. Новичок в Js, и вообще в web программировании, так что в шоке от отсутствия инфы и такого долгого поиска способа реализовать задуманное. Но не сдаюсь пока!
03 ноября 2016 13:04
2) switch select разве не на выделение реагирует? Ведь название само за себя говорит. Или она не понимает то, что возвращает функция Pick Object ? (Тут 2 вопроса в одном)Ей нужно событие нажатия мыши или touch-устройства. Выделение по клавиатуре все равно придется делать кодом. Тут есть 2 варианта:
1) По нажатию на клавиатуре вручную создавать событие нажатие мыши в центре канваса:
var m_cont = require("container");
...
var cont_elem = m_cont.get_container();
var event = new MouseEvent("mousedown", { clientX: cont_elem.offsetWidth/2, clientY: cont_elem.offsetHeight/2 });
cont_elem.dispatchEvent(event);
в результате по событию мыши сработает нода switch_select.
2) Скопипастить нодовое дерево целиком, в нем заменить switch_select на JS Callback. Эта нода вызывает колбек, от которого зависит выполнение последующих нод в нодовом дереве.
Колбек нужно зарегистрировать при старте приложения, например, в функции LoadedCallback:
var m_logn = require("logic_nodes");
...
var _status = true;
...
function load_cb() {
....
m_logn.append_custom_callback("my_callback", function() {
return _status;
});
....
}
Если возвращать из колбека true, то он приостановит дальнейшее выполнение нодового дерева, если false - то запустит. Поэтому сначала надо выставить true, например, через глобальную переменную, а потом менять её на false по событию нажатия с клавиатуры, тогда по нажатию запуститься остальная нодовая логика, такая же как и через switch_select.
Новичок в Js, и вообще в web программировании, так что в шоке от отсутствия инфы и такого долгого поиска способа реализовать задуманное.Если будут вопросы, спрашивайте. Задача нестандартная, т.к. нодовая логика клавиатуру не поддерживает и вообще у неё ограниченный функционал по сравнению c кодингом на js.
05 ноября 2016 01:21
Сделал все через Callback функцию, сейчас все работает даже лучше, чем хотел. активация только по клавише с проверкой расстояния и прочими примочками. Все как и нужно было, далее в нодах всю логику для "активируемых" объектов делаю и не парюсь) Доволен результатом. Большое спасибо за помощь!
PS
По поводу Ноды Play Animation.
Было бы круто, если бы добавили тип поведения: reverse (задом наперед). В Unity 3d такая штука есть например. Это сократит время тем людям, которым нужно проиграть анимацию задом наперед.
PS
По поводу Ноды Play Animation.
Было бы круто, если бы добавили тип поведения: reverse (задом наперед). В Unity 3d такая штука есть например. Это сократит время тем людям, которым нужно проиграть анимацию задом наперед.