Форум

Перенос курсора мыши на заданные координаты.

12 января 2018 13:57
Всем привет.

Я начинающий разработчик. Возник следующий вопрос.
Необходимо при клике мышкой переносить курсор мыши на определенные координаты, переменные для этого берутся в другой части кода. При этом используется FPS режим.

m_app.enable_camera_controls();
m_fps.enable_fps_controls();

var canvas2 = m_cont.get_canvas();
                   
            m_input.add_click_listener(canvas2, function event() {
                console.log("Зачем ты кликнул мышкой?");
                //Здесь нужна логика перенесения курсора мыши на необходимые координаты.
            });


Подскажите, как это можно реализовать?
Спасибо.
3d разработка, визуализация
Rels.One
17 января 2018 18:01
Здравствуйте! И добро пожаловать на форум!

Перемещать курсор в браузере средствами javascript нельзя, так как это огромная дыра для зловредного ПО. Но вы можете скрыть курсор и отслеживать перемещение мыши используя pointer lock. Далее вы можете рисовать свой собственный курсор и отслеживать все события нажания самостоятельно, правда работать это все будет только в канве конкретного HTML-элемента.
Теоретически кажется реализуема следующая стратегия:
1) Поверх всех элементов на странице располагаем полупрозрачный элемент, в канвас которого рисуем курсор.
2) Производим Pointer lock
3) Отслеживаем перемещения и клики и эмулируем нажатия на html-элементы, находящиеся под нашим полупрозрачным канвасом.

Звучит довольно зловредно
Александр (команда Blend4Web)
twitter
18 января 2018 13:29
Да, спасибо. Уже понял, что это невозможно по соображениям безопасности.

Ничего зловредного - объясню более подробно. Есть помещение, в котором игрок ходит в ФПС режиме. При первом клике мыши, когда игра загружается ФПС модуль автоматически скрывает курсор и физически замораживает его положение. Я хотел перекинуть его в центр экрана, чтобы он совпадал с центром камеры игрока и при наведении на определенные интерактивные объекты мог их активировать.

На данный момент я сделал это так:

    m_app.enable_camera_controls();
    m_fps.enable_fps_controls();
    
    var canvas = document.getElementById('main_canvas_container');      //Находит центр канваса
    var centerX = canvas.clientWidth / 2;
    var centerY = canvas.clientHeight / 2;
    
    var camera = m_scenes.get_active_camera();

        m_fps.set_rotation_cb(function(char, rot_x, rot_y) {            //Проверка вращения камеры игрока
            
            m_cam.rotate_camera(camera, rot_x, rot_y);
            var obj_hovered = m_scenes.pick_object(centerX, centerY);   //Проверка объекта на которую наведен центр канваса
            
            if (obj_hovered == Torus){                                  //Логика при наведении на объект 1


Не самая удобная реализация, так как set_rotation_cb работает каждый кадр и активация объекта происходит так же каждый кадр, нужно либо через дополнительные булевые переменные ограничивать это либо найти другое решение. Если кто что подскажет, как это удобнее сделать, буду благодарен.
3d разработка, визуализация
Rels.One
 
Пожалуйста, зарегистрируйтесь или войдите под своей учетной записью , чтобы оставлять сообщения.