私は最終的にその背後にある理由を見つけたときに、この問題を解決しようとしていました - 静的メソッド get_mouse_x() と get_mouse_y() を呼び出すと、呼び出された場所に応じて異なる結果が返されます: オブジェクトの update() メソッドから呼び出された場合、常に 0.0 を返しますが、draw() メソッドから呼び出された場合は有効な回答を返します。
ボタン クラス (問題が発生する場所):
public abstract class Button extends Drawable_object {
...
@Override
public void update()
{
super.update();
mouseOver_last = mouseOver;
mx = Game_logic.get_mouse_x();
my = Game_logic.get_mouse_y();
// for some reasons mx and my are always 0.0
if ((mx <= x + ((double)width / 2))&&
(mx >= x - ((double)width / 2))&&
(my >= y - ((double)height / 2))&&
(my <= y + ((double)height / 2)))
{ mouseOver = true;}
else mouseOver = false;
...
}
@Override
public void draw(Graphics g)
{
super.draw (g);
g.drawString ("x - width / 2 = " + String.valueOf(x - width), 10, 30);
g.drawString ("mouse_x = " + String.valueOf(Game_logic.get_mouse_x()), 10, 40);
// at this point get_mouse_x() returns true result
g.drawString ("x + width / 2 = " + String.valueOf(x + width), 10, 50);
g.drawString ("y - width / 2 = " + String.valueOf(y - width), 200, 30);
g.drawString ("mouse_y= " + String.valueOf(Game_logic.get_mouse_y()), 200, 40);
// at this point get_mouse_y() returns true result
g.drawString ("y + width / 2 = " + String.valueOf(y + width), 200, 50);
g.drawString ("mouseOver = " + String.valueOf(mouseOver), 10, 80);
...
}
...
}
マウス座標は、MouseAdapter を使用して Board クラスで設定されます。
public class Board extends JPanel implements ActionListener {
...
private class MAdapter2 extends MouseAdapter {
@Override
public void mouseMoved(MouseEvent e) {
Game_logic.set_mouse_x(e.getX());
Game_logic.set_mouse_y(e.getY());
}
}
...
}
すべてのものは、同じ Board クラスで更新および描画されます。
public void actionPerformed(ActionEvent e) {
update(); // calls update() method in every object
checkCollisions(); //checks collision
repaint(); // calls draw() method in every drawable object
}
では、オブジェクトの update() メソッド内で Game_logic.get_mouse_x() と Game_logic.get_mouse_y() を呼び出すと 0.0 値が返され、オブジェクトの draw() メソッド内で呼び出すと常に正しい値が返されるのはなぜでしょうか?