1

私は JavaFX 2.0 に慣れながらアニメーションで遊んでおり、X 軸と Y 軸に沿って四角形を回転させるための小さなテスト プログラムを作成しました。テストプログラムは次のとおりです。

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.ParallelTransition;
import javafx.animation.RotateTransition;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ParallelTransitionTest extends Application
{
    public static void main( String[] args )
    {
        launch( args );
    }

    @Override
    public void start( Stage primaryStage ) throws Exception
    {
        init( primaryStage );
        primaryStage.show();
    }

    private void init( Stage primaryStage )
    {
        primaryStage.setTitle( "Parallel Transition" );
        primaryStage.setResizable( true );

        // Create the scene
        BorderPane root = new BorderPane();
        Scene scene = new Scene( root, 800, 600, true );
        scene.setFill( Color.BLACK );
        primaryStage.setScene( scene );

        Rectangle rect = RectangleBuilder.create()
                .width( 100 ).height( 100 )
                .x( 350 ).y( 250 )
                .fill( Color.BLUE )
                .build();

        RotateTransition rotationY = new RotateTransition();
        rotationY.setAxis( Rotate.Y_AXIS );
        rotationY.setDuration( Duration.seconds( 5 ) );
        rotationY.setByAngle( 360 );
        rotationY.setNode( rect );
        rotationY.setAutoReverse( true );
        rotationY.setCycleCount( Animation.INDEFINITE );

        RotateTransition rotationX = new RotateTransition();
        rotationX.setAxis( Rotate.X_AXIS );
        rotationX.setDuration( Duration.seconds( 5 ) );
        rotationX.setByAngle( 360 );
        rotationX.setNode( rect );
        rotationX.setAutoReverse( true );
        rotationX.setCycleCount( Animation.INDEFINITE );

        FadeTransition fade = new FadeTransition();
        fade.setDuration( Duration.seconds( 5 ) );
        fade.setToValue( 0.2 );
        fade.setNode( rect );
        fade.setAutoReverse( true );
        fade.setCycleCount( Animation.INDEFINITE );

        ParallelTransition transition = new ParallelTransition( rect,
                rotationX, rotationY, fade );
        transition.setAutoReverse( true );
        transition.play();

        root.getChildren().add( rect );
    }
}

残念ながら、回転は 1 つの軸に対してのみ発生しています。私の仮定では、両方RotationTransitionの が実行されていますが、一方が他方によって適用された回転を上書きしています。これは の意図した動作RotationTransitionですか?

また、次の 3 行がコメント化されている場合:

        rotationY.setNode( rect );
        ...
        rotationX.setNode( rect );
        ...
        fade.setNode( rect );

を取得しNullPointerExceptionます。ドキュメントは、に含まれるトランジションにノードを設定する必要はないことを示唆していますParallelTransition。これはバグですか?

4

1 に答える 1

1

別のノードを作成し、そのノードに四角形を追加してから、次のことを行う必要があります。

RotateTransition rotationY = new RotateTransition();
        rotationY.setAxis( Rotate.Y_AXIS );
        rotationY.setDuration( Duration.seconds( 5 ) );
        rotationY.setByAngle( 360 );
        rotationY.setNode( rect );
        rotationY.setAutoReverse( true );
        rotationY.setCycleCount( Animation.INDEFINITE );

        RotateTransition rotationX = new RotateTransition();
        rotationX.setAxis( Rotate.X_AXIS );
        rotationX.setDuration( Duration.seconds( 5 ) );
        rotationX.setByAngle( 360 );
        rotationX.setNode( NEWNODE );
        rotationX.setAutoReverse( true );
        rotationX.setCycleCount( Animation.INDEFINITE );
于 2012-09-11T10:10:43.447 に答える