Расположение мыши в java

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

Любые советы/предложения о том, как это сделать? Спасибо.


person user1391664    schedule 13.05.2012    source источник
comment
.. но вы также будете знать, что мышь не двигается, верно?   -  person sarnold    schedule 13.05.2012
comment
@sarnold: я думаю, дело в том, что мышь все еще может двигаться, а курсор — нет.   -  person Greg Hewgill    schedule 13.05.2012
comment
@ Грег: Ах! Еще во времена моего Quake, если вы сместите мышь на два пикселя от центра, вы будете вращаться очень медленно, но непрерывно, а если вы переместите ее к краю, вы будете вращаться очень быстро (и также непрерывно). Поскольку перемещение только тогда, когда движется мышь, кажется, что для этого требуется много места на столе, я, тем не менее, не уделял этому параметру особого внимания. :)   -  person sarnold    schedule 13.05.2012


Ответы (2)


В некоторых играх при каждом событии движения мыши курсор перемещается обратно в середину экрана, а вид перемещается с соответствующей величиной и направлением события мыши. Вы можете получить этот вектор, вычислив смещение позиции курсора к центру экрана перед центрированием курсора. Чтобы переместить курсор обратно в центр экрана, вы можете попробовать использовать класс java.awt.Robot.

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

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

person AerandiR    schedule 13.05.2012
comment
Так уж получилось, я сделал то же самое, ожидая ответа. Я не знал, что игры действительно делают это таким образом. Спасибо - person user1391664; 13.05.2012
comment
Отличный материал, пожалуйста! Обычно это называется блокировкой мыши/курсора/указателя. - person AerandiR; 13.05.2012

Я пытался использовать java.awt.Robot, как предлагает AerandiR, но столкнулся с парой проблем, и, возможно, с ними столкнутся и другие люди, поэтому я уточню.

Если ваша цель — удерживать курсор в одной позиции (предпочтительно в центре экрана), то вам нужно вызвать что-то вроде robot.mouseMove(width/2, height/2); в конце вашего метода mouseMoved(). В этой реализации каждый раз, когда мышь перемещается от центра, Robot будет перемещать ее обратно в центр.

Однако, когда Robot повторно отцентрирует мышь, игрок вернется туда, где он был. По сути, игрок будет заикаться между исходной позицией и повернутой позицией.

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

Вот так: turnAmountX += e.getX() - width/2;

Теперь, если Robot повторно центрирует мышь, e.getX() - width/2 всегда будет давать ноль.

Резюме:

    void mouseMoved(MouseEvent e) {
        turnAmountX += e.getX() - width/2;
        turnAmountY += e.getY() - height/2;
        robot.mouseMove(this.getLocationOnScreen().x + width/2, 
            this.getLocationOnScreen().y + height/2;
    }
person Croolsby    schedule 13.08.2012
comment
Благодарю вас! Это была дополнительная информация, которая мне была нужна, но я нигде не мог ее найти. Гениально. - person LucidObscurity; 15.09.2014