0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

JavaFX(Java8)備忘録

Posted at

トリプルスプレッドさせた時のコードを載せておく。

画像:
img/dog.gif [size:640x480]
img/dog.png
img/tarot_XX.jpg(XX=0~21) [size:300x420]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javafx.animation.ParallelTransition;
import javafx.animation.RotateTransition;
import javafx.animation.ScaleTransition;
import javafx.animation.TranslateTransition;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.util.Duration;

public class Main extends Application {
	private double mouseX;
	private double mouseY;
	private double startX;
	private double startY;
	private int nowPlaying;

	private final int stageHeight = 120;
	private final int cardY = 95;

	@Override
	public void start(Stage primaryStage) {
		try {
			BorderPane root = new BorderPane();
			// ==========
			// 0-21 タロット
			// ==========
			for (Tarot t : Tarot.values()) {
				Image i = new Image(t.image());
				ImageView iv = new ImageView(i);
				iv.setFitHeight(stageHeight / 10);
				iv.setPreserveRatio(true);
				iv.setSmooth(true);
				iv.setCache(true);
				iv.setX(80);
				iv.setY(cardY - stageHeight / 20);
				root.getChildren().add(iv);
			}

			// ==========
			// 22 dog
			// ==========
			Image dog = new Image("img/dog.gif");
			ImageView dogView = new ImageView(dog);
			dogView.setY(stageHeight);
			dogView.setFitWidth(200);
			dogView.setPreserveRatio(true);
			dogView.setSmooth(true);
			dogView.setCache(true);
			root.getChildren().add(dogView);

			Scene scene = new Scene(root, 600, stageHeight);
			scene.setFill(Color.TRANSPARENT);
			primaryStage.initStyle(StageStyle.TRANSPARENT);
			primaryStage.setScene(scene);
			primaryStage.getIcons().add(new Image("img/dog.png"));
			primaryStage.setOnCloseRequest(req -> Platform.exit());
			primaryStage.setX(1920);
			primaryStage.setY(1080 - stageHeight);
			primaryStage.show();

			opening(dogView).play();

			root.setOnMousePressed(e -> {
				switch (e.getButton()) {
				case PRIMARY:
					if (nowPlaying == 0) {
						tripleSpread(root.getChildren());
					}
					break;
				case SECONDARY:
					this.mouseX = primaryStage.getX() - e.getScreenX();
					this.mouseY = primaryStage.getY() - e.getScreenY();
					this.startX = e.getScreenX();
					this.startY = e.getScreenY();
					break;
				case MIDDLE:
					removeTarot(root.getChildren());
					exit(dogView).play();
					break;
				default:
				}
			});
			root.setOnMouseDragged(e -> {
				switch (e.getButton()) {
				case SECONDARY:
					primaryStage.setX(e.getScreenX() + this.mouseX);
					primaryStage.setY(e.getScreenY() + this.mouseY);
				default:
				}
			});
			root.setOnMouseReleased(e -> {
				switch (e.getButton()) {
				case SECONDARY:
					if (this.startX == e.getScreenX() && this.startY == e.getScreenY()) {
						removeTarot(root.getChildren());
					}
				default:
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private ParallelTransition opening(ImageView dogView) {
		ScaleTransition size1 = new ScaleTransition(Duration.millis(250));
		size1.setFromX(0.8);
		size1.setToX(0.8);
		TranslateTransition pos1 = new TranslateTransition(Duration.millis(250));
		pos1.setFromY(0);
		pos1.setToY(-stageHeight);
		ScaleTransition size2 = new ScaleTransition(Duration.millis(150));
		size2.setFromX(0.8);
		size2.setToX(1);
		TranslateTransition pos2 = new TranslateTransition(Duration.millis(150));
		pos2.setByY(20);

		ParallelTransition pt2 = new ParallelTransition(dogView, size2, pos2);
		ParallelTransition pt1 = new ParallelTransition(dogView, size1, pos1);
		pt1.setOnFinished(e -> pt2.play());
		return pt1;
	}

	private ParallelTransition exit(ImageView dogView) {
		ScaleTransition size1 = new ScaleTransition(Duration.millis(150));
		size1.setFromX(1);
		size1.setToX(0.8);
		TranslateTransition pos1 = new TranslateTransition(Duration.millis(150));
		pos1.setToY(-stageHeight);
		ScaleTransition size2 = new ScaleTransition(Duration.millis(250));
		size2.setFromX(0.8);
		size2.setToX(0.8);
		TranslateTransition pos2 = new TranslateTransition(Duration.millis(250));
		pos2.setFromY(-stageHeight);
		pos2.setToY(0);

		ParallelTransition pt2 = new ParallelTransition(dogView, size2, pos2);
		ParallelTransition pt1 = new ParallelTransition(dogView, size1, pos1);
		pt1.setOnFinished(e -> pt2.play());
		pt2.setOnFinished(e -> Platform.exit());
		return pt1;
	}

	private void tripleSpread(ObservableList<Node> children) {
		// 初期化
		removeTarot(children);
		// 配置
		List<Tarot> tarot = Tarot.shuffle();
		List<Position> position = Position.random(3);
		for (int i = 0; i < 3; i++) {
			int ms = 400 + 200 * i;
			ScaleTransition size = new ScaleTransition(Duration.millis(ms));
			size.setFromX(1);
			size.setToX(10);
			size.setFromY(1);
			size.setToY(10);
			TranslateTransition pos = new TranslateTransition(Duration.millis(ms));
			int x = 130 + 90 * i;
			pos.setFromX(0);
			pos.setToX(x);
			pos.setFromY(0);
			pos.setToY(stageHeight / 2 - cardY);
			RotateTransition deg = new RotateTransition(Duration.millis(ms));
			int d = position.get(i).getDeg();
			deg.setFromAngle(-540 + d);
			deg.setToAngle(d);

			Node t = children.get(tarot.get(i).getNum());
			ParallelTransition pt = new ParallelTransition(t, size, pos, deg);
			nowPlaying += 1;
			pt.setOnFinished(e -> nowPlaying--);
			pt.play();
		}
	}

	private void removeTarot(ObservableList<Node> children) {
		if (nowPlaying == 0) {
			// 初期化
			for (Tarot tarot : Tarot.values()) {
				Node t = children.get(tarot.getNum());
				ScaleTransition size = new ScaleTransition(Duration.millis(1));
				size.setToX(0);
				size.setToY(0);
				TranslateTransition pos = new TranslateTransition(Duration.millis(1));
				pos.setToX(0);
				pos.setToY(0);
				ParallelTransition pt = new ParallelTransition(t, size, pos);
				pt.play();
			}
		}
	}

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

	enum Tarot {
		J(0), I(1), II(2), III(3), IV(4), V(5), //
		VI(6), VII(7), VIII(8), IX(9), X(10), //
		XI(11), XII(12), XIII(13), XIV(14), XV(15), //
		XVI(16), XVII(17), XVIII(18), XIX(19), XX(20), XXI(21);

		private int num;

		private Tarot(int num) {
			this.num = num;
		}

		int getNum() {
			return num;
		}

		String image() {
			return "img/tarot_" + num + ".jpg";
		}

		static List<Tarot> shuffle() {
			List<Tarot> deck = new ArrayList<>(Arrays.asList(Tarot.values()));
			Collections.shuffle(deck);
			return deck;
		}
	}

	enum Position {
		Upright(0), Reverse(180);
		private int deg;

		private Position(int deg) {
			this.deg = deg;
		}

		int getDeg() {
			return deg;
		}

		static List<Position> random(int size) {
			List<Position> all = Arrays.asList(Position.values());
			List<Position> rnd = new ArrayList<>();
			while (rnd.size() < size * 3) {
				rnd.addAll(all);
			}
			Collections.shuffle(rnd);
			return rnd.subList(0, size);
		}
	}
}

なお、ビルドに失敗してアプリ化まで至らなかった。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?