2017-06-10 2 views
4

を使用して、私はJavaで私の最初のゲームを作った - 蛇、 それはだメインループは、このJavaのスネークゲーム回避のThread.sleep

while (true) 
    { 
     long start = System.nanoTime(); 
     model.eUpdate(); 
     if (model.hasElapsedCycle()) 
     { 
      model.updateGame(); 
     } 
     view.refresh(); 
     long delta = (System.nanoTime() - start)/1000000L; 
     if (delta < model.getFrameTime()) 
     { 
      try 
      { 
       Thread.sleep(model.getFrameTime() - delta); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

のように見えます。しかし、私のプロジェクトのrequirmentsにに応答する点があるので、私は必要スレッドスリープを別のものに変更するには、簡単な方法でこれをどうやって行うのか分かりません。 事前にアドバイスをありがとうございます。

+4

あなたのフレームレートで呼び出されるものには['Timer'](https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html)を使用します。 – ChiefTwoPencils

+1

このアドバイスをいただきありがとうございます!私はタイマーを自分のプロジェクトに実装しました。それは完璧に機能しています。昨日発見した固定ポーズバグでも:) – Azathanai

+1

答えを@chiefに変えることを検討してください。 –

答えて

3

私は、Javaで簡単なゲームや2をやったと私はスイングTimerを使用してきたゲームのメインループを処理するために。タイマーを使用すると、提供されたdelayが経過した後にActionListenerを発動するように設定できます。中間の遅延はフレームレートから得られます。最も基本的な使用法は、次のようになります。

Timer timer = new Timer(delay, listener); 
timer.start(); 

これは、初期値と中間値の遅延を同じ値に設定します。そうのように必要に応じて、あなたはまた、別の値であることが、それらを設定できます

Timer timer = new Timer(delay, listener); 
timer.setInitialDelay(0); 
timer.start(); 

を上記の例では、listenerは、起動した後、その後で-間delayでできるだけ早く発生します。

-2

時間が経過したときにタスクを実行します。ループするだけです。

while (true) 
{ 
    long delta = (System.nanoTime() - start)/1000000L; 
    if (delta >= model.getFrameTime()) 
    { 
     long start = System.nanoTime(); 
     model.eUpdate(); 
     if (model.hasElapsedCycle()) 
     { 
      model.updateGame(); 
     } 
     view.refresh(); 
    } 
} 
+0

私はそれが常に実行されるので、CPU集中型であると思います。何らかのイベントでパークして処理を開始するには何らかの方法が必要です。 –

+2

おめでとうございます。あなたは非常に高価なファンヒーターを設計しました。これはひどい考えです。 –

-1

上記のようにTimerを使用すると、sleep()を呼び出さずに指定された遅延後にトリガーすることができます。

もう少し複雑ですが自作したい場合は、スリープを処理する新しいスレッドを開始してください。 いくつかのプーリング頻度でプーリング機構を配置して、thread.sleepを回避することができます。whileループで条件を入力し、条件が満たされない場合は何らかの時間待機してください。

//more code here It is a sample code 
    synchronized(this) { 
     while (delta < model.getFrameTime()) { 
      this.wait(500); 
     } 
     //more code 
+2

あなたはそれを呼び出すオブジェクトのロックを取得せずに 'wait'を呼び出すことはできません。あなたはあなたの答えにそれを含めるべきです。 'sleep'はロック取得を必要としませんが' wait'はそれを必要とします。 –

+0

同期化されたブロックを追加しました。私は待ち合わせ部分のみをハイライト表示しようとしていますので、追加しませんでした。 –

+0

ok今すぐ次のステップ。スレッドが待機しています、それがメインスレッドか他のスレッドかどうかを答えて教えてください。それがメインスレッドであり、応答性がどのように解決されるのかを待っていますか?それが別のスレッドであれば、あなたの答えにはどこに言及しますか? –