2011-10-19 3 views
0

私は現在、さまざまな時間にランダムにポップアップするいくつかのターゲットからなる小さなゲームに取り組んでいます。ターゲットが物理的なので、実際のゲームは回路基板からのI/Oを取得します。Java - タイマーによって制御される複数のオブジェクト(ゲーム用)

私の問題は、現在、2秒ごとに発火するjava.util.Timerがあることです。トリガされるとランダムなターゲットが表示されます(これまでのところうまくいきます)。問題は、タイマーがまだ動作している間に1から5までのランダムな秒数のターゲットを表示し、他のターゲットを設定したいということです。

エラーは表示されず、ターゲットは表示されますが消えません。私はそれがスレッドの問題のいくつかの種類だと思うし、おそらく私はを使用しているので*ターゲットオブジェクトはちょうど何とかnetherで失われている!私はこれが出ている、ここで質問を中心に検索した後:

public class Target implements Runnable(){ 

    ... 

    public void displayFor(int seconds){ 
     this.display(); 

     Executors.newSingleThreadScheduledExecutor().schedule(this,time, 
       TimeUnit.SECONDS); 

     this.setDisplayed(false); 
    } 

    @Override 
    public void run() { 
     this.destroy(); 
    } 

} 

基本的には初期のゲームタイマー(ターゲットディスプレイのセットがあること)の後にメソッドを実行し、ターゲットを実行しますdisplayFor(2)メソッドを呼び出します時は過ぎた。ターゲットはまだ消えません。

私はは別のjava.util.Timerをオフに設定)displayFor(のようにこれを行うの異なるいくつかの方法を試してみましたが、私はまた、Quartzライブラリを使用してで行く(正直に言うと、とにかくやり過ぎのように思えていました)、まだそれを動作させることはできません。エラーメッセージがないので、私は本当にこのメッセージに固執しています。

私はそれがその関連はないと思うので、私は多くのコードを含めていないましたが、あなたたちは私だけが知っている:)

+0

それらを描画するときは、毎回キャンバスをクリアしますか?または、それらが現れるときにそれらを描くだけですか? – corsiKa

+0

@glowcoder私は何も描画していません、ターゲットは現実世界の物理的なオブジェクトなので、私は表示すると出力を回路基板に送ります – Peter

+0

すべてのdisplayFor()呼び出しで新しいエグゼキュータを作成すべきではありません。クラスメンバーにして再利用してください。 – Stephan

答えて

1

私はそれが働いて得ることができました。これは、同様の状況にある誰のための正しいコードです。

public class Target{ 

private Timer timer; 

    ... 

    public void displayFor(int seconds) { 
    // send the output 
    BoardInterface.SetDigitalChannel(this.getId()); 

    // calculate the delay 
    long time = seconds * 1000; 

    // create a new timer and schedule the new task 
    timer = new Timer(); 
    timer.schedule(new TargetTimer(this), time); 

    this.setDisplayed(true); 
    } 
} 

class TargetTimer extends TimerTask{ 
    Target target; 

    public TargetTimer(Target t){ 
     this.target = t; 
    } 

    @Override 
    public void run() { 
     target.destroy(); 
    } 

} 

これは良い方法ですが機能するかどうかは不明です。あなたが改善される可能性があることに気づいたら、私に知らせてください。みんなありがとう!

0

おそらく、あなたは私たちに何を教えてください助けるために多くの情報が必要な場合displayメソッドがあります。

un- destroy /デストラクターコードでターゲットを表示していますか?

私は、void display()代わりをお勧めします:

public void setDisplayed(boolean display){ 
    if(display) { 
    ///... do appropriate circuit output to turn on target 
    } else { 
    /// ... do appropriate circuit output to turn off target 
    } 
} 

そしてもちろん

public void run(){ 
    setDisplayed(false); 
    destroy(); 
} 
+0

私は実際にそれを理解してそれをすべて稼働させましたが、私の評判の点でさらに6時間は自分の質問に答えることができません。私は実際にあなたの話をsetDisplay()メソッドを作成しました!あなたの助けと他のみんなにも感謝します。私はできる限り私の解決策で質問に答えます。 – Peter

関連する問題