H3XXX
H3XXX

Reputation: 647

Slow down the call to a specific function

I have a game loop here, that calls the tick method. Inside the tick method, other tick methods are called. How would I slow down the call to input.tick() without slowing down the whole program? Putting a Thread.sleep(); anywhere in the tick methods slows down the whole program and that is not what I want.

public void run() {
    long lastTime = System.nanoTime();
    long timer = System.currentTimeMillis();
    final double ns = 1000000000.0 / 60.0;
    double delta = 0;
    int frames = 0;
    int ticks = 0;

    while(running){
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;

        while(delta >= 1){
            tick();
            ticks++;
            delta--;
        }
        render();
        frames++;

        if(System.currentTimeMillis() - timer > 1000){
            timer += 1000;
            System.out.println(ticks + " tps, " + frames + " fps");
            ticks = 0;

            frames = 0;
        }
    }
    stop();
}

  public void tick(){
    input.tick(); // How do I slow down the call to this?

    if(gameState){
        player.tick();
        player.move();
        collision();
        treeline.move();
        obstacleHole.move();
        obstacleWolf.move();
        coin.move();
        coin.tick();
}
}

Upvotes: 0

Views: 293

Answers (3)

Marko Topolnik
Marko Topolnik

Reputation: 200196

It seems you are doing a GUI application and the code you are showing runs on the Event Dispatch Thread. The sleeps make the EDT freeze and be unable to update the GUI. What you must do instead is use the javax.swing.Timer class to postpone the execution of the code.

If you want to tick at regular intervals, then just reschedule the same task again in the handler submitted to Timer.

Upvotes: 2

c.s.
c.s.

Reputation: 4826

If the input.tick() method collects the input of the player (e.g. key presses) it does no seem appropriate to delay it.

Perhaps you might be interested in implementing a Keyboard Input Polling mechanism. (see here for an example).

This is a usual technique in games so you do not respond to the input of the player in the usual way you would with other GUI applications. Instead you collect all the user input e.g. in a queue and then you poll that queue to read input at your own speed (e.g. 30 times per second).

I hope it helps

Upvotes: 1

morgano
morgano

Reputation: 17422

Use a Thread to call tick() in a deferred way, something like this:

private static final Timer TIMER = new Timer();

// ...

public void tick(){

    TIMER.schedule(new TimerTask(){

        void run() {
            input.tick(); // Your tick method
        }


    }, 1000 /* delay in milliseconds */)

    // ... rest of your method

}

Upvotes: 1

Related Questions