Обработка перемещения мыши в стиле камеры в Javascript (включение непрерывного движения мыши) - PullRequest
9 голосов
/ 27 июля 2011

Идея: Я создаю простой скрипт WebGL (использующий замечательный three.js от mrdoob), который позволяет пользователю управлять камерой в мире объектов.Предполагается, что камера имитирует традиционные камеры-шутеры от первого лица (например, справочная информация по Team Fortress 2).То есть камера движется только тогда, когда движется мышь.

Проблема: в Javascript, единственный способ обнаружить движение мыши - это если сам курсор перемещается.Для сравнения, игры FPS не показывают курсор - они основывают движение камеры только на том, как движется мышь.Таким образом, вы можете перемещать мышь по всему коврику для мыши в любом направлении, и это всегда работает.

Хотя в браузере, поскольку движение камеры основано на курсоре, вы не можете двигаться, но пока.Когда курсор ударяется о край экрана, пользователь не может смотреть дальше в этом направлении (например, при перемещении мыши к левому краю экрана вы больше не можете смотреть влево).

Решение: Я думал о двух решениях, но ни одно из них я не знаю, как реализовать.Либо

  1. После того, как мышь перемещена, JavaScript сбрасывает ее в центр экрана.Таким образом, после каждого движения мыши игрок снова может двигаться в любом направлении.Проблема заключается в том, что на основании проведенного мною исследования Javascript не может контролировать положение мыши пользователя (по понятным причинам, поскольку на злокачественных сайтах это будет несравненная неприятность).

  2. Или мышь «оборачивается» вокруг экрана.Это означает, что когда пользователь достигает одного края экрана, мышь просто переходит на другую сторону экрана.(см .: http://www.digicowsoftware.com/detail?_app=Wraparound) Однако, похоже, что это тоже не врожденная возможность javascript, а только то, что может решить сторонняя программа.

Итак,Имеет ли смысл проблема? Если да, могу ли я реализовать вышеуказанные решения или мне не хватает другого?

Ответы [ 4 ]

4 голосов
/ 28 июля 2011

Мировое сообщество в настоящее время работает над проектом спецификации, чтобы решить эту проблему.То, что вы заявляете, называется «блокировка мыши».Я немного поработал над первым этапом этого стандарта, чтобы помочь разобраться, что нужно.Пожалуйста, проголосуйте за эти проблемы и подпишитесь на указанные списки рассылки, чтобы все мы могли исправить эту проблему как можно скорее.

Тем не менее, есть еще способ достичь своей цели (которыйя нашел другой способ): родной плагин, который управляет мышью.

(я тоже создаю игру, которая является FPS, но в настоящее время не будет выпущена из-за этого ограничения)

3 голосов
/ 31 января 2013

Для тех, кто все еще заинтересован в достижении этого, теперь это несколько доступно.

Использование:

document.addEventListener('pointerlockchange', changeCallback, false);

см. Пример http://www.html5rocks.com/en/tutorials/pointerlock/intro/

1 голос
/ 27 июля 2011

Вы правы во всем этом. Основанная на стандартах веб-технология не даст вам захват мыши, как вы хотите.

Тем не менее, вы можете создать (или найти) специальный SWF, который может собирать данные о перемещении мыши и передавать их в javascript. Это не будет ограничивать движение курсора, хотя вы можете использовать CSS, чтобы скрыть курсор, когда захват мыши активен. Но это может быть в состоянии, например, продолжать запускать события «переместить мышь влево», даже когда курсор достиг левого края экрана.

Любой такой SWF-файл, вероятно, не сможет зафиксировать движение, когда курсор находится за пределами области просмотра, т.е. над браузером Chrome.

0 голосов
/ 27 июля 2011

Учитывая, что в HTML5 / Javascript это, по-видимому, невозможно сделать так, как на счет этого варианта: обрабатывать положение мыши (не движение мыши) как представление скорости поворота.

Таким образом, если мышь находится выше определенного порога от центра, камера поворачивается влево; чем дальше левая мышь, тем быстрее поворачивается камера. Чтобы остановить поворот, игрок перемещает мышь назад к центру.

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

...