0

我在这里有一个游戏循环,它调用了 tick 方法。在tick 方法内部,调用了其他tick 方法。如何在不减慢整个程序的情况下减慢对 input.tick() 的调用?在 tick 方法中放置 aThread.sleep();会减慢整个程序的速度,这不是我想要的。

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();
}
}
4

3 回答 3

2

看来您正在做一个 GUI 应用程序,并且您显示的代码在事件调度线程上运行。s使sleepEDT 冻结并且无法更新 GUI。您必须做的是使用javax.swing.Timer类来推迟代码的执行。

如果您想tick定期执行,则只需在提交到的处理程序中再次重新安排相同的任务Timer

于 2013-07-28T12:03:56.273 回答
1

使用 Thread 以tick()延迟方式调用,如下所示:

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

}
于 2013-07-28T12:04:06.047 回答
1

如果 input.tick() 方法收集玩家的输入(例如按键),它似乎不适合延迟它。

也许您可能对实现键盘输入轮询机制感兴趣。(见这里的例子)。

这是游戏中的常用技术,因此您不会像使用其他 GUI 应用程序那样响应玩家的输入。相反,您收集所有用户输入,例如在一个队列中,然后轮询该队列以您自己的速度(例如每秒 30 次)读取输入。

我希望它有帮助

于 2013-07-28T12:57:19.073 回答