I started writing another input class based on everyones feedback.
So I wanted to know if the mouse is pressed just once or if it is held down. I wanted it to be thread safe. I also wanted it to use a method called poll, as that seems to be the convention, and it seems that it should be called before the game as updated. Only one method is synchronized, as that is the only chance that variables could be manipulated by two threads at the same time. But maybe I’m getting confused so let me know.
Here is the code. I just wrote it out quickly so it may contain a stupid mistake, but I’ve tested it and it seems to work so far.
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Component;
public class InputManager extends MouseAdapter {
private volatile MouseState previousMouseState = new MouseState();
private volatile MouseState nextMouseState = new MouseState();
private volatile MouseState currentMouseState = new MouseState();
public InputManager(Component component) {
component.addMouseListener(this);
component.addMouseMotionListener(this);
}
public synchronized void poll() {
// I find this less confusing then swapping refrences, but may change it later.
previousMouseState.x = currentMouseState.x;
previousMouseState.y = currentMouseState.y;
previousMouseState.down = currentMouseState.down;
currentMouseState.x = nextMouseState.x;
currentMouseState.y = nextMouseState.y;
currentMouseState.down = nextMouseState.down;
}
// returns whether mouse was pressed since last frame
public boolean mousePressed() {
return !previousMouseState.down && currentMouseState.down ;
}
public boolean mouseDown() {
return currentMouseState.down;
}
// returns whether mouse was released last frame
public boolean mouseReleased() {
return previousMouseState.down && !currentMouseState.down;
}
public boolean mouseUp() {
return !currentMouseState.down;
}
public int getMouseX() {
return currentMouseState.x;
}
public int getMouseY() {
return currentMouseState.y;
}
public boolean mouseMoved() {
return currentMouseState.x != previousMouseState.x
|| currentMouseState.y != previousMouseState.y;
}
public boolean mouseDragged() {
return (currentMouseState.down && previousMouseState.down)
&& mouseMoved();
}
@Override
public void mousePressed(MouseEvent event) {
nextMouseState.down = true;
}
@Override
public void mouseReleased(MouseEvent event) {
nextMouseState.down = false;
}
@Override
public void mouseMoved(MouseEvent event) {
nextMouseState.x = event.getX();
nextMouseState.y = event.getY();
}
@Override
public void mouseDragged(MouseEvent event) {
nextMouseState.x = event.getX();
nextMouseState.y = event.getY();
}
private class MouseState {
private volatile boolean down;
private volatile int x;
private volatile int y;
}
}