2017-01-10 5 views
3

私はゲームを作っています。 私はすべての私の形を保持する配列を作成します。 形状を0.1秒ごとに小さくする必要があります。 同時に私はマウスの後ろに円があります。 私はいつも私のマウスの後に円を動かすことができる必要がありますが、私は他の円を少しずつ動かす方法を見つけませんでした。 他のサークルを移動しようとすると、javaFXウィンドウがロードされる前にすべての瞬間に移動します。どのように私は0.1秒ごとに実行され、配列を渡すことができるexcecutableを作成するのですか

これは私がアイブ氏は

final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); 
    executorService.scheduleAtFixedRate(Timingobjects::myTask, 0, 1, TimeUnit.SECONDS); 
}//        program name, function, wait before start, time before each loop 

    private static void myTask() { 

     System.out.println("Running"); 
    } 

を使用しようとしましたが、私が見つけたサークルを作成して、私の形状配列

ArrayList<Shape> Objects = new ArrayList<Shape>(); 

Circle I = ClassObjects.getCircle(randomWidth,randomX,randomY);  
Objects.add(I); 

に追加私のアレイ

ですこれは実行可能なエグゼキュータサービスなので、retはありませんurnの値が渡される可能性があり、配列を渡すこともできません。

Iveは呼び出し可能なExecutorサービスを見ようとしましたが、コード化する方法を理解できません。

誰かが0.1秒ごとに実行される実行可能ファイルの例を私に与えて、シェイプ配列リストを渡して変更してから戻すことができる場合は、

私は非常に感謝します。

+2

あなたがこれを行うにはJavaFXのアニメーションを作成する必要があります。 UIスレッド以外のスレッドからUI要素を直接変更することはできず、アニメーションのタスクをスケジュールしようとするとオーバーヘッドが大きくなり、スムーズに実行するのに十分な確定性が得られません。 – erickson

答えて

1

は、例えばOracleのAnimation and Visual Effects in JavaFXチュートリアルでTimelineの使用を参照してください。

その他の場合は、AnimationTimerを使用できます。

タイムラインまたはアニメーションタイマーにノードを渡す必要はありません。ノードがシーングラフに保存され、タイムラインまたはアニメーションタイマーのイベント処理コードから直接シーングラフノードを操作することができます。 JavaFXのフレームレートは、デフォルトでは、毎秒60のフレームで処理されること

final Timeline timeline = new Timeline(); 
timeline.setCycleCount(Animation.INDEFINITE); 
timeline.getKeyFrames().add(
    new KeyFrame(Duration.millis(100)), 
    new KeyValue(node.translateXProperty(), 25)) 
); 
timeline.play(); 

注:0.1秒毎に処理タイムラインを作成するために、例えば

。 .1秒のタイムラインは正確に0.1秒ごとに呼び出されることはありません。

も関連:

+0

答えはありませんが、私は愚かです。代わりに、私の円を動かすためにトランジションを使用する必要があります。代わりに、配列の円を変更してxとyを直接変更しようとしていました。とにかく、これが私にjavaFXをもっと見るように促してくれたことに感謝します。 – Dynermite

0

TimerTaskで可能です。 TimerTaskのように拡張:

class CustomTimerTask extends TimerTask { 
    List<Shape> shapes; 

    public CustomTimerTask(List<Shape> shapes, /* observers*/) { 
     this.shapes = shapes; 
    } 

    @Override 
    public void run() { 
     // update shapes 
     // notify(about mouse events or whatever) 
    } 
} 

値を返そうとしないでください。観察者のパターンを使用して、加入者に通知します。

そして今

Timer timer = new Timer(true); 
timer.scheduleAtFixedRate(new CustomTimerTask(shapes/*, */), 0, 0.1 * 1000); 
+0

あなたのタイマータスクでは、文字列オブジェクトに図形のリストを割り当てています。 –

関連する問題