Wednesday, May 29, 2013

Animasi bola dengan JavaFX

Nah ini adalah kelanjutan dari tutorial sebelumnya tentang rotasi pada JavaFX:



Anda tinggal menambahkan sedikit sentuhan untuk memberi efek rotasi dengan trigger mouse...
selamat mencoba..!
package fjr.booksample;

import org.omg.CORBA.Environment;

import javafx.scene.transform.Rotate;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Orientation;
import javafx.scene.Group;
import javafx.scene.GroupBuilder;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.control.Slider;
import javafx.scene.control.SliderBuilder;
import javafx.scene.image.Image;
import javafx.scene.image.ImageViewBuilder;
import javafx.scene.layout.StackPane;


/**
 * cari gambar sebanyak 46 buah (bisa juga sejumlah lain tapi biar mudahnya pake 46).. 
 * kemudian namakan dengan pic1.jpg, pic2.jpg dst.... liat method getArrayImage di bawah.. :D 
 * 
 * @author meta alias trisna utami yang pacarnya suka ama lev landau... :D
 */
public class MakeABall extends Application {

 static final int NUM_ARRAY = 46;

 private void init(Stage primaryStage) {
  final Group root = new Group();
  StackPane mainPane = new StackPane();
  mainPane.setMinSize(800, 600);

  primaryStage.setScene(new Scene(mainPane));

  Image[] images = MakeABall.getArrayImage();
  final  Group mainEnsembel = new Group();

  int a = 0;
  Image[] imageA = new Image[12];
  for (int i = 0; i < imageA.length; i++) {
   imageA[i] = images[a];
   a++;
  }
  ImageEnsembel ensembelA = new ImageEnsembel(imageA, 0, 153);
  ensembelA.setTranslateX(200);
  ensembelA.setTranslateY(200);
//  ensembelA.ry.setAngle(12);
  mainEnsembel.getChildren().add(ensembelA);

  Image[] imageB = new Image[10];
  for (int i = 0; i < imageB.length; i++) {
   imageB[i] = images[a];
   a++;
  }

  Group ensembelB = new ImageEnsembel(imageB, 30, 140);
  ensembelB.setTranslateX(200);
  ensembelB.setTranslateY(290);
  mainEnsembel.getChildren().add(ensembelB);

  Image[] imageC = new Image[10];
  for (int i = 0; i < imageC.length; i++) {
   imageC[i] = images[a];
   a++;
  }

  ImageEnsembel ensembelC = new ImageEnsembel(imageC, 30, 140);
  ensembelC.setTranslateX(200);
  ensembelC.setTranslateY(150);
  ensembelC.rz.setAngle(180);
  mainEnsembel.getChildren().add(ensembelC);
  
  
  Image[] imageD = new Image[6];
  for(int i =0 ;i < imageD.length; i++){
   imageD[i] = images[a]; 
   a++; 
  }
  
  ImageEnsembel ensembelD = new ImageEnsembel(imageD, 65, 110);
  ensembelD.setTranslateX(200);
  ensembelD.setTranslateY(355);
  mainEnsembel.getChildren().add(ensembelD);
 
  
  
  Image[] imageE  = new Image[6]; 
  for(int i =0 ; i< imageE.length ; i++){
   imageE[i] = images[a] ;
   a++; 
  }
//  
  ImageEnsembel ensembelE = new ImageEnsembel(imageE, 65, 110); 
  ensembelE.setTranslateX(200);
  ensembelE.setTranslateY(85);
  ensembelE.rz.setAngle(180);
  mainEnsembel.getChildren().add(ensembelE);
  
  Image[] imageF = new Image[2]; 
  for(int i =0 ; i< imageF.length ; i++){
   imageF[i] = images[a] ;
   a++; 
  }
  
//  ImageEnsembel ensembelF = new ImageEnsembel(imageA, 0, 180);
//  ensembelF.setTranslateX(210);
//  ensembelF.setTranslateY(210);
//  ensembelF.rz.setAngle(90);
  
//  mainEnsembel.getChildren().add(ensembelF);
  
  
  mainEnsembel.setRotationAxis(Rotate.Y_AXIS);
//  mainEnsembel.setRotate(90);
  root.getChildren().add(mainEnsembel);

  final Group xGroup = new Group();
  xGroup.getChildren().add(root);
  final Slider slider = SliderBuilder.create()
    .orientation(Orientation.VERTICAL).minWidth(50).minHeight(50)
    .value(50).maxHeight(70).translateX(-230).translateY(-200)
    .build();
  slider.valueProperty().addListener(new ChangeListener() {
   @Override
   public void changed(ObservableValue arg0,
     Number arg1, Number arg2) {
    root.setRotationAxis(Rotate.X_AXIS);
    if (slider.getValue() < 50) {
     root.setRotate(slider.getValue() - 50);
    } else {
     root.setRotate(slider.getValue() - 50);
    }
   }
  });

  final Slider slider2 = SliderBuilder.create()
    .orientation(Orientation.VERTICAL).minWidth(50).minHeight(50)
    .maxHeight(70).translateX(-200).translateY(-200).build();

  slider2.valueProperty().addListener(new ChangeListener() {
   @Override
   public void changed(ObservableValue arg0,
     Number arg1, Number arg2) {
    mainEnsembel.setRotationAxis(Rotate.Y_AXIS);
    mainEnsembel.setRotate(slider2.getValue() * 2);
   }
  });

  root.setRotationAxis(Rotate.X_AXIS);
  mainPane.getChildren().add(xGroup);
  

  mainPane.getChildren().addAll(slider, slider2);
  primaryStage.setResizable(true);
 }




 class ImageEnsembel extends Group implements Cloneable
 {
  
  final Rotate rx = new Rotate(0, Rotate.X_AXIS);
  final Rotate ry = new Rotate(0, Rotate.Y_AXIS);
  final Rotate rz = new Rotate(0, Rotate.Z_AXIS);
  
  public ImageEnsembel(Image[] images, double angles, double space) 
  {
   super();
   double angle = 0;
   double jarak = 360 / images.length;
   getTransforms().addAll(rx,ry,rz);
   for (int i = 0; i < images.length; i++) {
    Xform xform = new Xform();
    xform.getChildren()
      .add(ImageViewBuilder.create().image(images[i])
        .fitWidth(60).fitHeight(50)
        .preserveRatio(false)
        .rotationAxis(Rotate.Y_AXIS).rotate(90).build());
    xform.rz.setAngle(angles);
    xform.setTranslateX(space);
    Xform xform1 = new Xform();
    xform1.getChildren().add(xform);
    xform1.ry.setAngle(angle);
    getChildren().add(xform1);
    angle += jarak;
   }
  }
  
  public Object clone() throws CloneNotSupportedException{
   return super.clone();
  }
 }

 static String[] getArrayString() {
  String[] array = new String[NUM_ARRAY];
  String a = "pic";
  for (int i = 0; i < array.length; i++) {
   array[i] = a.concat(Integer.toString(i + 1).concat(".jpg"));
  }
  return array;
 }

 static Image[] getArrayImage() {
  Image[] array = new Image[NUM_ARRAY];
  String[] arrStr = getArrayString();
  for (int i = 0; i < array.length; i++) {
   array[i] = new Image(MakeABall.class.getResource(arrStr[i])
     .toExternalForm());
  }
  return array;
 }

 class Xform extends Group {
  final Rotate rx = new Rotate(0, Rotate.X_AXIS);
  final Rotate ry = new Rotate(0, Rotate.Y_AXIS);
  final Rotate rz = new Rotate(0, Rotate.Z_AXIS);

  public Xform() {
   super();
   getTransforms().addAll(rz, ry, rx);
  }
 }

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

 public static void main(String[] args) {
  launch(args);
 }
}

No comments: