我有一个处理所有鼠标事件的类,这样很容易检查是否单击了鼠标按钮,但是它似乎仅在添加以下行时起作用: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();
如果在更新底部没有
System.out.println(mouseManager.getMouseX());
,则mouseManager.isLeftPressed()
不起作用。那么如何解决呢?并且这可能与上面的错误有关,但是即使使用
println()
功能,mouseManager似乎也不总是检测鼠标的按下。 最佳答案
鼠标更新发生在另一个线程上,对此没有显式处理。考虑到从MouseManager到调用者的单向信息流,此处可能需要挥发性字段:
private volatile boolean leftPressed, rightPressed;
private volatile int mouseX, mouseY;
顺便说一句,您应该查看将
static
类字段替换为final
实例字段(此外,将其作为构造函数参数传入):private final MouseManager mouseManager = new MouseManager();