2016-11-24 2 views
-1

パスの遷移を作成して再生するメソッドのコードを次に示します。内部のパスを持つmetodが呼び出されたとき、右または左からpathTransitionをランダムに開始する方法はありますか?

void moveAereo() 
{  
     //ImageView transition 
     PathTransition aereo = new PathTransition(); 
     PathElement[] path = new PathElement [5]; 
     path[0]=new MoveTo(-60 ,30); 
     path[1]=new LineTo(800 ,100); 
       path[2]= new LineTo(700,50);  
       path[3]= new LineTo(750,30); 
     path[4]=new ClosePath(); 

     Path pista = new Path(); 
     pista.getElements().addAll(path); 
     aereo.setNode(getAereo()); 
     aereo.setPath(pista); 
       aereo.setAutoReverse(true); 
     aereo.setInterpolator(Interpolator.LINEAR); 
     aereo.setDuration(new Duration(5000)); 
     //ciclo infinito 
     aereo.setCycleCount(Animation.INDEFINITE); 
     aereo.play(); 
} 
+0

アニメーションが開始された後、それはまだそれがパスの末尾に到達したときに、ランダムに実行するか、または反対方向に移動を開始する必要がありますか? – fabian

+0

終わりに達すると逆方向に動き始めます。問題の状態です。助けてくれてありがとう –

+0

メソッドが呼び出されると、アニメーションの速度はランダムに選択されるべきです。 : –

答えて

0

ランダムにアニメーションを再生し、マイナスレートを許可するレートを決定するだけです。レートが正か負かによって、最後または最初からアニメーションを再生します。

例:

private final Random random = new Random(); 
private static final double MAX_RATE = 5; 
private static final double MIN_ABSOLUTE_RATE = 0.5; 

private double getRandomRate() { 
    double magnitude = (MAX_RATE - MIN_ABSOLUTE_RATE) * random.nextDouble() + MIN_ABSOLUTE_RATE; 
    return random.nextBoolean() ? magnitude : -magnitude; 
} 

@Override 
public void start(Stage primaryStage) { 
    Button btn = new Button("Change"); 

    Rectangle node = new Rectangle(10, 10); 

    PathTransition aereo = new PathTransition(); 
    PathElement[] path = new PathElement[5]; 
    path[0] = new MoveTo(-60, 30); 
    path[1] = new LineTo(800, 100); 
    path[2] = new LineTo(700, 50); 
    path[3] = new LineTo(750, 30); 

    path[4] = new ClosePath(); 

    Path pista = new Path(); 
    pista.getElements().addAll(path); 

    aereo.setPath(pista); 
    aereo.setAutoReverse(true); 
    aereo.setInterpolator(Interpolator.LINEAR); 
    Duration duration = Duration.seconds(5); 
    aereo.setDuration(duration); 

    aereo.setCycleCount(Animation.INDEFINITE); 
    aereo.setNode(node); 

    btn.setOnAction((ActionEvent event) -> { 
     double newRate = getRandomRate(); 

     aereo.setRate(newRate); 
     if (newRate > 0) { 
      // play from beginning 
      aereo.playFromStart(); 
     } else { 
      // play from end 
      aereo.playFrom("end"); 
     } 
    }); 

    Pane root = new Pane(btn, node); 

    Scene scene = new Scene(root, 900, 200); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

私はスピードの問題を解決しましたが、ポーズで問題が発生しました。再生( "終了")。私はそれがどのように動作するかを本当に知っていませんが、終わり。そのアニメーションを開始できるメソッドを知っている場合は、メソッドが呼び出されたときに上または下に移動すると非常に役立ちます。ありがとう –

+0

@ErInd [ドキュメントにしたがって](https://docs.oracle.com/javase/8/javafx/api/javafx/animation/Animation.html#getCuePoints--)キューポイント '' end "'はアニメーションの終わりに配置することができます(テストしたときにはこの方法で動作します)。しかし、aereo.playFrom( "end")をaereo.playFrom(aereo.getTotalDuration())に置き換えることもできます。アニメーションが前または後で再生されるかどうかは、レートの記号によって決まります。 – fabian

+0

。答えはありがたいですが、両方の方法でコードをコピーして、飛行機は最初から開始されます。たぶん、問題は、レートの符号が決して負にならない、またはあなたがメインを試している間に、パスのメソッドを呼び出すことです。私はそれがaereo.play()の問題であると思っていましたifとelseしかし、私はそれを削除しようとし、何も変わっていません。私は分かりません:/ –

関連する問題