2017-01-30 9 views
0

私はJavaFXで単純な宇宙船ゲームを作っています。私はクラスSpaceShipを持っていて、私はこのクラスのランダムなオブジェクトをランダムな開始位置(例えば5秒間隔)でメインゲームループに入れたいと思っています。タスクのためにTimer schedule()メソッドを使用しようとしています。問題は、私が宇宙船の鮮明な画像を得ることができないということです。絶え間なくループしているので、それは消えて、他のポイントに現れます。誰かがこれをどう扱うべきかアドバイスをしてくれますか?AnimationTimerループでオブジェクトジェネレータを作成する方法JavaFX

マイゲームループ:

new AnimationTimer() { 
 
      @Override 
 
      public void handle(long currentNanoTime) { 
 

 
       double t = (currentNanoTime - startNanoTime)/1000000000.0; 
 

 
       double xMoving = ((100 * t) % (canvas.getWidth() + 100)); 
 

 
       double x = 232 + 128 * Math.cos(t); 
 
       double y = 232 + 128 * Math.sin(t); 
 

 
       //background image clears canvas 
 
       gc.drawImage(space, 0, 0); 
 
       gc.drawImage(earth, x, y); 
 
       gc.drawImage(sun, 196, 196); 
 
       // draw UFO 
 
       gc.drawImage(ufo.getFrame(t), 100, 25); 
 

 
       //draw spaceShip 
 
       SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150))); 
 
       //timer schedule 
 
       Timer timer = new Timer(); 
 
       timer.schedule(new TimerTask() { 
 
        @Override 
 
        public void run() { 
 
         SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 230))); 
 
        } 
 
       }, 5000); 
 
      } 
 
     }.start();

宇宙船クラス:

package objectClasses; 

import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.image.Image; 


public class SpaceShip{ 

private final GraphicsContext gc; 
private final double frame; 
private final double y; 
private final double x; 
private AnimatedImage object; 

public SpaceShip(Image[] arr, double duration, GraphicsContext gc, double frame, double x, double y) { 
    object = new AnimatedImage(); 
    this.object.frames = arr; 
    this.object.duration = duration; 
    this.gc = gc; 
    this.frame = frame; 
    this.y = y; 
    this.x = x; 
} 

private void drawShip() { 
    this.gc.drawImage(this.object.getFrame(frame), x, y); 
} 

public static void generate(SpaceShip spaceShip) { 
    spaceShip.drawShip(); 
} 

}

+1

SpaceShipインスタンスをリストまたは他のコレクションに格納していますか?問題のコードを表示していない場合は、お手伝いできません。 [MVCE](http://stackoverflow.com/help/mcve)が最適でしょう。 – Dth

答えて

0

これが犯人です。

SpaceShip.generate(new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150))); 

は基本的には、各フレームであなたは SpaceShipの新しいインスタンスを作成します。点滅する画像は、宇宙船が何度も何度も繰り返し作成されることによって発生します。それは動作しません。

あなたはこれらのオブジェクトに外のゲームループを作成し、その参照を格納する必要があります:あなたは自分の俳優の位置を更新する(その部分が欠落している)と、それらを描く保つゲームループで

SpaceShip mySpaceShip = new SpaceShip(spaceShipImageArr, 0.100, gc, t, xMoving - 100, (randomNum + 150)); 

新しいポジションで

SpaceShip.generate(mySpaceShip); 

サイドノート:あなたはdrawに名前を変更、drawShip公開し、完全generateメソッドを削除し、単にmySpaceShip.draw()を呼び出すことができます - あなたのメソッドの役割何より明らかであろう。オブジェクトがそれ自身を描くことは、まったく受け入れられます。

+0

ありがとう、これは私の多くを助けます。 – user7470489

+0

あなたは大歓迎です:) – Dth

関連する問題