0

tick メソッドを呼び出すゲームループがあります。tick メソッド内では、他の tick メソッドが呼び出されます。プログラム全体を遅くすることなく、input.tick() の呼び出しを遅くするにはどうすればよいですか? tick メソッドのどこかに aを配置Thread.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 により EDT がフリーズし、sleepGUI を更新できなくなります。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 アプリケーションで行う通常の方法でプレーヤーの入力に応答することはありません。代わりに、たとえばキューにすべてのユーザー入力を収集し、そのキューをポーリングして、独自の速度で入力を読み取ります (たとえば、1 秒あたり 30 回)。

役立つことを願っています

于 2013-07-28T12:57:19.073 に答える