2017-07-16 11 views
1

私はこの新しいゲームを手に入れました。 短い話ですが、私のGUIにはイベントディスプレーヤーとして機能するテキストエリアがあります。あなたがモンスターと戦うとき、このテキストエリアは "あなたがスケルトンに3点のダメージを与える"か "スケルトンがあなたの上に火球を投げ、5点のダメージを与える"のようなテキスト行を表示するために使用されます。Javafx - テキストエリア内の新しい行の表示を延期するにはどうすればよいですか?

コードは、モンスターがあなたを攻撃するように動作します。だからあなたが "攻撃"ボタンを押すとすぐに、あなたがしたことを言っている行と、その怪物がテキストエリアに同時に現れた行を示す行の両方が表示されます。あなたがそれを命中した直後に、光の速度であなたを襲うモンスターのように。

私がしたいのは、モンスターのラインの表示を遅らせることです。だから私が "Attack"ボタンを押すと、テキストエリアには私がやった行が表示され、次に1秒待ってからモンスターの行が表示されます。

私はThread.sleep()メソッドを使用しようとしましたが、UIを1秒間一時停止してから、両方の行がテキストエリアに表示されます。

private void attackBareFists() { 

    if (initPJ > enemyINIT) { // Player has more initiative -> 
           // Player attacks first 
     turnPlayerBareFists(); // This method will display the player's line 

     if (!endTurn()) { // endTurn() checks that the player or the monster 
          // are still alive before continuing the fight 
      delay(); 
      turnMonster(); // This method will display the monster's line 
      endTurn(); 
     } 
    } ... // The code continues, but it's the same as above except monster attacks first 
} 

/** 
* Wait for some time 
*/ 
private void delay(){ 

} 

delay()には何を入れますか?これは私がThread.sleep(1000)を試したところです。そして私が言ったように、turnPlayerBareFists()とturnMonster()のコードがdelay()の後に実行されるようにしました。どんな助けもありがとう。

答えて

0

大きな質問!

public static void delay(long delayMs, Runnable toRun){ 
    Thread t = new Thread(() ->{ 
     try { Thread.sleep(delayMs); }catch(InterruptedException ignored){} 
     Platform.runLater(toRun); 
    }); 
    t.setDaemon(true); 
    t.start(); 
} 

この方法で、あなたが正確にどのように長い遅延がdelay()への呼び出しとするとき、あなたのコードが実行されるべき間のように指定することができます:私はこのようなものを使用することをお勧め。基本的には、メソッドの2番目の引数として実行するコードを含むRunnableを渡します。例えば

、これはあなたのモンスターのターンのような表現されることを意味する:「()(何らかの理由で、あなたがラムダを使用しない、場合

if(!endTurn()) 
    delay(1000,()->{ turnMonster(); endTurn(); }); 

- >

public static void delay(long delayMs, Runnable toRun){ 
    Thread t = new Thread(new Runnable(){ 
     public void run(){ 
      try { Thread.sleep(delayMs); }catch(InterruptedException ignored){} 
      Platform.runLater(toRun); 
     } 
    }); 
    t.setDaemon(true); 
    t.start(); 
} 

をそして、あなたのモンスターのコードは次のようになります:「もの)、あなたはこれを使用することができます

if(!endTurn()) 
    delay(1000, new Runnable(){ public void run(){ turnMonster(); endTurn(); } }); 

Platformjavafx.application.Platformを指し、runLater()メソッドは常にJavaFXスレッドに指定されたRunnableをポストするので、UIを操作するコードを渡すことは安全です。

+0

ありがとう!これは私が欲しかったのとまったく同じでしたどうもありがとうございました! – NZoth

2

これを達成するためのより良い/より一貫した方法は、タイマを使用することです。 javafx自体は、タイムドイベントのためのいくつかのメカニズムを提供しますが、任意のJava実装を使用できます。

一つの方法は、上記の方法はjavafx animations (as you can read in the documentation)

This blogための基本はあなたが定期タスクを達成することができる方法のいくつかのより多くの例を示したもであるタイムライン

Timeline timeline = new Timeline(new KeyFrame(
    Duration.millis(1000), 
    ae -> doSkellyTurn()), 
    new KeyFrame(
    Duration.millis(1000 + 1000), // as mentioned by fabien, the time offset is relative to the 'start()' method, not to its previous keyframe! 
    ae -> endSkellyTurn())); 
timeline.play(); 

です。 (Ps。reactFXも使用しています!)

+0

@ fabien良い点、私はそれに応じてそれを編集しました – n247s

関連する問題