2017-02-23 1 views
1

私はJavaでゲームをプログラミングしています。メッセージ管理を追加したいと思います。まだ送信されていないすべてのメッセージを含むArrayListが存在するはずです。 2秒ごとにリストの次の項目が表示されます。Java slick;遅れてもループしないでコマンドを実行する。

私のロジック:最初のメッセージが表示されるべき更新Methodeので

。 2秒後にこのアイテムは削除されます。

私の問題は、ちょうど最初のものが表示され、他のものは表示されないということです。私がデバッグしていたとき、私はこれらの2秒後にタイマーが2秒の休憩なしに最初のアイテムを削除し続けることに気づいた。

問題を見つけたり、より良いロジックを見つけたりできますか?

私のコーディングの一部です。

MothodeはMethodeのレンダーキュー

public static void showMessage(String message){ 
    msgHandler.addMessage(message); 
} 

にメッセージを入れて

public void render(GameContainer gameContainer, Graphics g) throws SlickException { 
    msgHandler.getCurrentMessage().displayMessage(g); 
    if(msgHandler.isTimerCompleted()){ 
     msgHandler.next(); 
    } 
} 

メッセージマネージャクラス

public class MessageHandler { 
    private ArrayList<Message> messages; 
    private int duration = 2000; 
    private Timer timer = new Timer(); 
    private boolean isTimerCompleted = true; 

    public MessageHandler() { 
     messages = new ArrayList<>(); 
    } 

    public void next() { 

     isTimerCompleted = false; 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       if (messages.size() > 0) { 
        messages.remove(0); 
       } 
       System.out.println("test"); 
      } 
     }, duration); 
     isTimerCompleted = true; 
    } 

    public Message getCurrentMessage() { 
     if (messages.size() > 0) 
      return messages.get(0); 
     return new Message(""); 
    } 

    public void addMessage(String message, int x, int y) { 
     messages.add(new Message(message, x, y)); 
    } 

    public void addMessage(String message) { 
     messages.add(new Message(message)); 
    } 
} 

答えて

0

以下の例のような定期的なタイマーを使いたいようです。 また、timer.scheduleは、タイマーが終了するまで実行を一時停止しません。代わりに、制限時間が経過すると、タイマーのrun()部分が実行されます。現在、isTimerCompleted = trueです。タイマーを作成するとすぐに実行されます。

timer.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
    // Your database code here 
    } 
}, 2*60*1000, 2*60*1000); 

良い概要はここにある: https://stackoverflow.com/a/4044793/1320066

EDIT:

より明確にするために、「真isTimerCompleted =」は、すぐにあなたのタイマータスクが作成されているように実行されているので、あなたは、効果的に新しいTimerTaskを継続的に作成します。 「isTimerCompleted = true;」を動かしてみてください。 "public void run(){..}"コードブロックの内側に移動します。何が起こっているかの例

、あなたの文が実行されているどのような順序で表示するためのコードのこの単純なセクションを実行してみてください:

import java.util.TimerTask; 
import java.util.Timer; 

public class TimerSchedule { 

    public Timer timer = new Timer(); 

    public void TestTimerSchedule() { 
     System.out.println("Before timer.schedule"); 
     timer.schedule(new TimerTask() { 
      @Override 
      public void run() { 
       System.out.println("TimerTask"); 
      } 
     }, 2000); 

     System.out.println("After timer.schedule"); 
    } 

} 

が出力:

Before timer.schedule 
After timer.schedule 
TimerTask 
+0

私はあなたがこれを理解だと思います違う。関数が呼び出されるたびに、2秒の遅延があり、メッセージがリストから削除されます。 私の問題は、タイマーが初めて終了した後、runメソッド内のすべてが継続的に実行されるということです。ループしています。しかし、私はrunメソッドが無限ループではないことを望んでいます。 – Lorenz

+0

こんにちは、少し具体的に私の答えを更新しました。あなたの考えを教えてください。 –

+0

ありがとう!それは働いた! 素晴らしい一日を過ごしましょう。 – Lorenz

関連する問題