2017-04-13 5 views
3

私は一連の四角形を描くjavaで蛇プログラムを書いています。スネークの長方形が矢印キーが当たったのと同じ場所で方向を変えるように、ブロックの方向変更をどのように遅らせるかは分かりません。プログラムの残りの部分が実行され続ける一方で、ある方法で待つ必要があります。矢印キーが押された場合、それは(...アップのためのu、ダウン用D)私の長方形の向きを変更するには、このメソッドをトリガーJavaのプログラム全体を遅延させないで、1つのメソッド内で遅延させる方法はありますか?

`public void changeDirection(String dir) 
{ 
    for(int i = 0; i<snakearray.size(); i++) 
    { 
    //checks to make sure youre not changing straight from l to r or u to d 
     if(dir.equals("r")||dir.equals("l")) 
     { 
      if(//direction of currect element is up or down) 
      //makes the current element of the array change to the new direction 
      {snakearray.set(i, snakearray.get(i).newDirection(dir));} 
     } 
     else if(dir.equals("u")||dir.equals("d")) 
     { 
      if(//current element's direction is right or left) 
      {snakearray.set(i, snakearray.get(i).newDirection(dir));} 
     } 
     //pause method but not game method needed here???? 
    } 
}` 

私はする必要が一時停止を実装するが方法ですか?私はthread.sleep(20)メソッドを試しましたが、プログラム全体を一時停止します。

+0

このコードは独自のスレッドにする必要があります –

+0

この動作が必要な場合は、別のスレッドを作成して使用する必要があります。 しかし、あなたがそれをするまで、あなたはメインスレッドを眠るでしょう –

+1

ちょうどあなたのメインメソッドにスレッドt =新しいスレッド(changeDirection)とt.sleep(何でも)を入れてください。 –

答えて

0

ScheduledExecutorServiceという名前を使用できます。これにより、指定された遅延で別のスレッドでコードを実行することができます。


例:

@Test 
    public void test() throws ExecutionException, InterruptedException { 
    final ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
    ScheduledFuture<?> future = service.schedule(() -> changeDirection("r"), 2, TimeUnit.SECONDS); 

    // Just for the test to wait until the direction change has been executed 
    // In your code you would not need this if you want your program to continue 
    future.get(); 
    } 

    private void changeDirection(String dir) { 
    System.out.println("Changing direction to " + dir); 
    // Your code 
    } 

説明:

上記のコードは、2秒の遅延を使用してメソッドを実行します。 futureという戻り値は、実行が終了したときに追跡できるようになっています。これを使用すると、プログラムは実行が完了するまで待機します。
メインプログラムを待たせたくない場合は、future.get()を無視してください。メインコードは遅れずに引き続き実行されます。スケジュールされた方法だけが遅れます。

1

単純な方法で新しいスレッドを作成することは忘れてしまいます。たとえば、1秒に1回動くタイミングを欲し、ヘビを動かす方法を変える必要があります。

まずタイミング:

swing.Timer:https://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html その非常に使いやすい、それはfuncionalitiesをたくさん持っています。

または、最後の移動からの時間を測定することによって、非常に基本的なタイミングを実装できます。

lastTimenowの変数が必要です。

now = currentTime(); 
if(now - lastTime > delay){ 
    moveSnakeParts(); 
    lastTime = currentTime(); 
} 

第2に、スネークの部分を遅延させたくありません。ヘビはあなたがコントロールできる頭部と体の部分のリストを持っています。あなたがしなければならないことは、前の位置を記憶している頭を動かし、最初の身体部分を頭の前の位置に移動させ、最初の身体部分を前の位置などに保存することです。

+0

私は自分のプログラムを設定して、流れるような動きをするように頭が長さごとに動かないようにすることができました。それはあまりにも不安定に見えてしまったので、頭が前の位置に移動しないからですほとんど完全にお互いの上にあるでしょう –

+0

あなたは長さであなたのヘビを移動する必要はありませんまだあなたは頭の最後の位置の最後にヘビの位置の次の部分を移動することができます。あなたの蛇の部分は10平方10で、それは1px移動します。左下の頭が0 0の場合、右下が10 0で、左に1px移動した後の最初の体の位置になります。とにかくあなたは多くの方法でその動きを作り出すことができますが、あなたの動議を解決するものは眠っていません。 – eldo

+0

私は答えたようにそれを実装することをお勧めします。あなたが望む動きに問題がある場合は、もう1つ質問してください。 – eldo

関連する問題