我有一个处理所有鼠标事件的类,这样可以很容易地检查鼠标按钮是否被单击,但它似乎只有在我添加此行时才起作用:system.out.println(mouseManager.getMouseX());
。
MouseManager 类:
public class MouseManager implements MouseListener, MouseMotionListener {
private boolean leftPressed, rightPressed;
private int mouseX, mouseY;
public MouseManager() {
}
public boolean isLeftPressed() {
return leftPressed;
}
public boolean isRightPressed() {
return rightPressed;
}
public int getMouseX() {
return mouseX;
}
public int getMouseY() {
return mouseY;
}
@Override
public void mouseMoved(MouseEvent e) {
mouseX = e.getX();
mouseY = e.getY();
}
@Override
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
leftPressed = true;
}
else if (e.getButton() == MouseEvent.BUTTON3) {
rightPressed = true;
}
}
}
正如您所看到的,MouseManager 类非常简单,但它用于在其他类中调用以使鼠标输入更容易。 但是在 Visuals 类(这不是一个合适的名称,它更多的是主类)中出现了问题。
public void Update() {
if (mouseManager.isLeftPressed()) {
Vector2 posClicked = GetRoundedMousePos();
int index = GetPosInArray(posClicked);
System.out.println(Grid.cells.get(index).cellType.toString());
if (Grid.cells.get(index).cellType == Cell.CellType.GROUND) {
Grid.cells.get(index).cellType = Cell.CellType.SAND;
repaint();
}
}
System.out.println(mouseManager.getMouseX());
}
如您所见,我添加了 prinln
以确保其正常工作。
注意:
- 我只展示了Update方法,因为整个脚本太长了
- 每一帧都会调用 Update 方法
- mouseManager 在上面用以下行声明:
private static MouseManager mouseManager = new MouseManager();
如果 Update 底部没有 System.out.println(mouseManager.getMouseX());
,mouseManager.isLeftPressed()
将不起作用。那么如何解决这个问题呢?
AND这可能与上面的错误有关,但即使使用println()
函数,mouseManager似乎并不总是检测到鼠标按下。
请您参考如下方法:
鼠标更新发生在另一个线程上,并且没有对此进行显式处理。考虑到从 MouseManager 到调用者的单向信息流, volatile 字段可能就是您所需要的:
private volatile boolean leftPressed, rightPressed;
private volatile int mouseX, mouseY;
顺便说一句,您应该考虑用 final
实例字段替换该 static
类字段(并且进一步将其作为构造函数参数传递):
private final MouseManager mouseManager = new MouseManager();