1
\$\begingroup\$

I have a specific method that saves my mouse x and y coordinates. I want that mouse coordinates be saved by specific time (for example after 1000ms). How I need to do that in Java? Please add a simple usage example.

 public void mouseMoved(MouseEvent e) {
        currentX = e.getX();
        currentY = e.getY();

        if(enemy.onWall() == true){
            timer.schedule(new TimerTask(){
                public void run() {
                    saveX = e.getX();
                    saveY = e.getY();
                    enemy.setCont(true);
                    move();
                }
            },100);
            enemy.setOnWall(false);
        }
    }

But this code saves mouse coorinates immediately and then waits for 1000ms and I have old coordinates.

\$\endgroup\$
1
  • \$\begingroup\$ I have just edited my code. \$\endgroup\$ Commented Sep 19, 2014 at 13:38

1 Answer 1

5
\$\begingroup\$

EDIT

Actually, Timer's schedule method should work in this case - maybe it's running straight away because you have 100ms as your delay time instead of 1000 (from your code above that is).


If you're working in a multi-threaded environment, then make sure you handle possible concurrency issues.

A possible alternative would be to use System.nanoTime()

Declare these variables:

long delay = 1000;
long start = 0;
Point temp;

In the mouseMoved method:

    if(enemy.onWall() == true){
        temp = e.getLocation();
        start = System.nanoTime();
        enemy.setOnWall(false);
    }

(is enemy.setOnWall(false); supposed to be called after 1000ms?)

And in your game loop:

if (start > 0 && (System.nanoTime() - start) / 1000000 >= delay) {
    saveX = temp.getX();
    saveY = temp.getY();
    enemy.setCont(true);
    move();
    start = 0;
}

The "timer" is initiated when you move the mouse and is checked each frame to see if the duration since start was set is at least as long as the delay; if it is, the coordinates set at the start should be applied.

Since you move the mouse frequently, you may want to return the mouseMoved method if a coordinate is already scheduled to be saved.

This way you avoid multiple threads and result in a fairly accurate timed task.

\$\endgroup\$
1
  • \$\begingroup\$ nanoTime() is a good option here since it's more precise and the "downside" that it's from system start instead of Epoch doesn't matter. \$\endgroup\$
    – Eben
    Commented Sep 21, 2014 at 0:25

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .