Форум

"Select object" с помощью любой клавиши.

29 октября 2016 16:14 #13180
Делаю небольшой 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);
}
}
Но я не пойму, где в ней сам клик то обрабатывается, и как его на клавишу заменить?
30 октября 2016 14:45 #13188
Mouse.Js тоже ссылается на e. А он уже на уровне Html?
31 октября 2016 11:52 #13204
Я понял, что за выбор объекта вроде как pick object отвечает, но с клавишей так и не заработало(, он с canvas координатами работает же? (Короче много всего перепробовал, надеюсь поможете, а то я в ступоре)
01 ноября 2016 12:33 #13231
Я понял, что за выбор объекта вроде как pick object отвечает, но с клавишей так и не заработало(, он с canvas координатами работает же? (Короче много всего перепробовал, надеюсь поможете, а то я в ступоре)

Да, там нужны canvas-координаты. В случае с клавиатурой оптимально брать координаты центра канваса, т.е. выбор будет при непосредственном наведении на объект. Так можно и без кастования лучей сделать. Или вам нужно выбирать объекты в разных областях вьюпорта? Опишите алгоритм как это должно происходить.

Именно так нужно выбрать, чтобы Нода swith select поняла в итоге.
В нодах клавиатура не поддерживается, тут придется писать код. Если все-таки есть потребность большую часть логики делать через ноды, то можно использовать ноду JS Callback для вызова скриптов там, где без них не обойтись.
Команда Blend4Web
01 ноября 2016 12:44 #13234
User story такой:
Смотрю на объект - жму E- объект селектится.

Да, там нужны canvas-координаты. В случае с клавиатурой оптимально брать координаты центра канваса, т.е. выбор будет при непосредственном наведении на объект.
Два вопроса:
1) А центр формулой считать?
2) switch select разве не на выделение реагирует? Ведь название само за себя говорит. Или она не понимает то, что возвращает функция Pick Object ? (Тут 2 вопроса в одном)
01 ноября 2016 12:52 #13235
Основная цель это выделить клавишей также, как и кликом, чтобы нода поняла (Чтобы логику того, что после активаци произошло нодами колдовать). Очень-очень нужно именно так сделать, или это анриал? Может закостылить как-нибудь, В крайнем случае эмулировать клик (А-я-яй), но это я тоже пробовал уже, но тоже безуспешно. Новичок в Js, и вообще в web программировании, так что в шоке от отсутствия инфы и такого долгого поиска способа реализовать задуманное. Но не сдаюсь пока!
03 ноября 2016 13:04 #13311
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.
Команда Blend4Web
05 ноября 2016 01:21 #13355
Сделал все через Callback функцию, сейчас все работает даже лучше, чем хотел. активация только по клавише с проверкой расстояния и прочими примочками. Все как и нужно было, далее в нодах всю логику для "активируемых" объектов делаю и не парюсь) Доволен результатом. Большое спасибо за помощь!
PS
По поводу Ноды Play Animation.
Было бы круто, если бы добавили тип поведения: reverse (задом наперед). В Unity 3d такая штука есть например. Это сократит время тем людям, которым нужно проиграть анимацию задом наперед.
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.