Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mouse location in java

I am developing a first person shooter in Java and I want to implement controls in which movement of the mouse rotates the player. However in Java, I can only get mouse coordinates by using MouseListener events, so the coordinates will stop changing once the mouse cursor leaves the monitor edge and I will be unable to turn the player's view.

Any tips/suggestions on how to do that? Thanks.

like image 774
user1391664 Avatar asked May 13 '12 00:05

user1391664


People also ask

How do I find the location of my mouse?

In Mouse Properties, on the Pointer Options tab, at the bottom, select Show location of pointer when I press the CTRL key, and then select OK. To see it in action, press CTRL.

Can Java move a mouse?

Robot class generates events that can be used to control mouse, keyboard and can be used to take screenshots of the screen. In this article, we will implement Java Robot to move or drag the mouse to specified location. Methods used : mouseMove(int x, int y) : move the mouse to a specified location of screen.

Where is mouse position in Python?

To determine the mouse's current position, we use the statement, pyautogui. position(). This function returns a tuple of the position of the mouse's cursor. The first value is the x-coordinate of where the mouse cursor is.


2 Answers

I tried using a java.awt.Robot as AerandiR suggests, but there were a couple of problems I ran into, and it's possible other people will run into them as well, so I will elaborate.

If your goal is to keep the cursor in one position (preferably the center of the screen), then you will want to call something like robot.mouseMove(width/2, height/2); at the end of your mouseMoved() method. With this implementation, every time the mouse is moved off center, the Robot will move it back to the center.

However, when the Robot re-centers the mouse, the player will turn back to where it was. In effect, the player will stutter between the original position and a turned position.

To fix this, instead of defining how far your player turns on the difference between where the mouse is now and where it was, define it as the distance from the center.

Like so: turnAmountX += e.getX() - width/2;

Now, if the Robot re-centers the mouse, e.getX() - width/2 will always yield zero.

Recap:

    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;
    }
like image 65
Croolsby Avatar answered Sep 25 '22 08:09

Croolsby


In some games, on every mouse movement event the cursor is moved back to the middle of the screen, and the view moves with the corresponding magnitude and direction of the mouse event. You can get that vector by calculating the offset of the cursor position to the center of the screen prior to centering the cursor. To move the cursor back to the center of the screen you can try using the java.awt.Robot class.

Since you're building a first person shooter, you'll probably want to hide the center locked cursor, and draw your own crosshair where the player is intending to aim. That will also involve keeping track of where the cursor should be based on the running total of previous mouse movement events.

If you want to achieve behaviour where the view will continue moving relative to the starting position of the mouse (even once the mouse has stopped moving), you could keep a moving sum of all the previous mouse movement vectors, and move the view correspondingly once every frame. However, this probably applies more to something like a flight simulator than a first person shooter.

like image 40
AerandiR Avatar answered Sep 23 '22 08:09

AerandiR