package controller; import com.jfoenix.controls.JFXButton; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.stage.Stage; import javafx.util.Duration; import model.Case; import model.GameLoop; import model.GameTime; import model.Map; import java.awt.*; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Objects; import java.util.ResourceBundle; public class GamePlayController implements Initializable { private final int avancementCase = 4; private final PersoController persoController = new PersoController(); private final MapController mapController = new MapController(); @FXML public ImageView persoImageView; @FXML public AnchorPane levelRoot; @FXML public ImageView de; @FXML public ImageView creatureImageView = new ImageView(); @FXML public ImageView playerImagePerso; boolean finJeu = false; GameTime gameTime; GameLoop loop; Text textEnd; public int difficulty; public int perso; private Case caseActuelle, caseAncienne; private int i, diceNumber; private Thread personnage; private String pathPerso; private JFXButton button; private Boolean PersoMouv; @FXML @Override public void initialize(URL url, ResourceBundle resourceBundle) { } public void gameLauncher(){ levelRoot.getChildren().addAll(mapController.mapInitialisation(this.difficulty), persoController.playerInitialisation(this.difficulty,this.perso, mapController.getMap()), creatureImageView); persoController.setActualCase(mapController.getStartCase()); playerImagePerso.setImage(new Image("image/personnage/Perso" + this.perso + ".2.png")); loop = new GameLoop(this.difficulty, mapController.getMap(), creatureImageView); loop.start(); Text text = new Text(); text.setText("Time : "); text.setX(1000); text.setY(50); text.setFill(Color.WHITE); text.setStyle("-fx-font: 20 arial;"); Text textTimer = new Text(); textTimer.setText(""); textTimer.setX(1070); textTimer.setY(50); textTimer.setFill(Color.WHITE); textTimer.setStyle("-fx-font: 20 arial;"); textEnd = new Text(); textEnd.setText(""); textEnd.setX(500); textEnd.setY(500); textEnd.setFill(Color.WHITE); textEnd.setStyle("-fx-font: 100 arial; "); button = new JFXButton(""); levelRoot.getChildren().addAll(text,textTimer,textEnd,button); gameTime = new GameTime(textTimer); gameTime.start(); PersoMouv = false; } public void timer(){ if(finJeu){ gameTime.stop(); loop.stop(); } } public void movePlayerNextCase() throws InterruptedException { persoImageView = persoController.persoImageView; caseActuelle = persoController.getActualCase(); pathPerso = persoController.getPath(); caseAncienne = caseActuelle; persoController.setOldCase(caseAncienne); caseActuelle = mapController.getNextCase(caseActuelle); persoController.setActualCase(caseActuelle); Timeline timeline = new Timeline(); timeline.setCycleCount(1); int time1 = 100; int time2 = 200; int time3 = 300; int time4 = 400; int time5 = 500; int time6 = 600; int time7 = 700; int time8 = 800; if(caseActuelle != null){ //animation déplacement vers la droite if (caseActuelle.getCoordX() > caseAncienne.getCoordX()) { System.out.println(pathPerso + "7.png"); Image imagePerso7 = new Image(Objects.requireNonNull(getClass().getClassLoader().getResource(pathPerso + "7.png")).toExternalForm()); Image imagePerso8 = new Image(Objects.requireNonNull(getClass().getClassLoader().getResource(pathPerso + "8.png")).toExternalForm()); Image imagePerso9 = new Image(Objects.requireNonNull(getClass().getClassLoader().getResource(pathPerso + "9.png")).toExternalForm()); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time1), event -> { persoImageView.setImage(imagePerso8); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time2), event -> { persoImageView.setImage(imagePerso7); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time3), event -> { persoImageView.setImage(imagePerso9); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time4), event -> { persoImageView.setImage(imagePerso7); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time5), event -> { persoImageView.setImage(imagePerso9); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time6), event -> { persoImageView.setImage(imagePerso7); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time7), event -> { persoImageView.setImage(imagePerso9); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time8), event -> { persoImageView.setImage(imagePerso8); persoImageView.setLayoutX(persoImageView.getLayoutX() + avancementCase); })); timeline.play(); } //animation déplacement vers la gauche if (caseActuelle.getCoordX() < caseAncienne.getCoordX()) { Image imagePerso4 = new Image(getClass().getClassLoader().getResource(pathPerso + "4.png").toExternalForm()); Image imagePerso5 = new Image(getClass().getClassLoader().getResource(pathPerso + "5.png").toExternalForm()); Image imagePerso6 = new Image(getClass().getClassLoader().getResource(pathPerso + "6.png").toExternalForm()); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time1), event -> { persoImageView.setImage(imagePerso5); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time2), event -> { persoImageView.setImage(imagePerso4); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time3), event -> { persoImageView.setImage(imagePerso6); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time4), event -> { persoImageView.setImage(imagePerso4); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time5), event -> { persoImageView.setImage(imagePerso6); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time6), event -> { persoImageView.setImage(imagePerso4); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time7), event -> { persoImageView.setImage(imagePerso6); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time8), event -> { persoImageView.setImage(imagePerso5); persoImageView.setLayoutX(persoImageView.getLayoutX() - avancementCase); })); timeline.play(); } //animation déplacement vers le haut if (caseActuelle.getCoordY() < caseAncienne.getCoordY()) { Image imagePerso10 = new Image(getClass().getClassLoader().getResource(pathPerso + "10.png").toExternalForm()); Image imagePerso11 = new Image(getClass().getClassLoader().getResource(pathPerso + "11.png").toExternalForm()); Image imagePerso12 = new Image(getClass().getClassLoader().getResource(pathPerso + "12.png").toExternalForm()); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time1), event -> { persoImageView.setImage(imagePerso11); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time2), event -> { persoImageView.setImage(imagePerso10); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time3), event -> { persoImageView.setImage(imagePerso12); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time4), event -> { persoImageView.setImage(imagePerso10); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time5), event -> { persoImageView.setImage(imagePerso12); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time6), event -> { persoImageView.setImage(imagePerso10); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time7), event -> { persoImageView.setImage(imagePerso12); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time8), event -> { persoImageView.setImage(imagePerso11); persoImageView.setLayoutY(persoImageView.getLayoutY() - avancementCase); })); timeline.play(); } //animation déplacement vers le bas if (caseActuelle.getCoordY() > caseAncienne.getCoordY()) { Image imagePerso1 = new Image(getClass().getClassLoader().getResource(pathPerso + "1.png").toExternalForm()); Image imagePerso2 = new Image(getClass().getClassLoader().getResource(pathPerso + "2.png").toExternalForm()); Image imagePerso3 = new Image(getClass().getClassLoader().getResource(pathPerso + "3.png").toExternalForm()); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time1), event -> { persoImageView.setImage(imagePerso2); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time2), event -> { persoImageView.setImage(imagePerso1); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time3), event -> { persoImageView.setImage(imagePerso3); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time4), event -> { persoImageView.setImage(imagePerso1); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time5), event -> { persoImageView.setImage(imagePerso3); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(time6), event -> { persoImageView.setImage(imagePerso1); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(800), event -> { persoImageView.setImage(imagePerso3); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.getKeyFrames().add(new KeyFrame(Duration.millis(900), event -> { persoImageView.setImage(imagePerso2); persoImageView.setLayoutY(persoImageView.getLayoutY() + avancementCase); })); timeline.play(); } if(caseActuelle.isEnd()){ textEnd.setText("Fin"); finJeu = true; timer(); returnToStart(); } }else{ System.out.println("Case null"); } } public void returnToStart(){ button.setStyle("-fx-background-color: #EB9C0A; -fx-text-fill: white;"); button.setLayoutX(1071); button.setLayoutY(752); button.setPrefHeight(30); button.setPrefWidth(119); button.setText("Retour au début"); button.setOnAction(event -> { AnchorPane pane = null; try { pane = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MainPage.fxml"))); Stage a = new Stage(); a.setTitle("The Adventurer"); a.setScene(new Scene(pane, 900, 600)); a.setResizable(false); a.show(); Stage stage = (Stage) levelRoot.getScene().getWindow(); stage.close(); } catch (IOException e) { e.printStackTrace(); } levelRoot.getChildren().setAll(pane); } ); } public void lancerDe() { //Case actual = persoController.getActualCase(); if(PersoMouv == false) { animationDe(); } //verification(actual); } public void verification(Case actual) { Map map = mapController.getMap(); ArrayList array = map.getMap(); actual = mapController.getCase(actual, diceNumber); for (Case c : array) { if (actual.getCoordX() == c.getCoordX() && actual.getCoordY() == c.getCoordY() && c.isBonus()) { System.out.println("BONUS"); System.out.println("X perso : " + actual.getCoordX() + " Y perso : " + actual.getCoordY() + " X perso : " + c.getCoordX() + " Y perso : " + c.getCoordY() + " Bonus : " + c.isBonus()); } if (actual.getCoordX() == c.getCoordX() && actual.getCoordY() == c.getCoordY() && c.isMalus()) { System.out.println("MALUS"); } } } public void animationDe() { personnage = new Thread("personnage") { public void run() { i = 0; Timeline timeline = new Timeline(); timeline.setCycleCount(1); for (i = 0; i < 10; i++) { diceNumber = (int) (Math.random() * 6 + 1); String path = "image/dé/d" + diceNumber + ".png"; timeline.getKeyFrames().add(new KeyFrame(Duration.millis(50 * i), event -> de.setImage(new Image(path)))); } timeline.play(); for (i = 0; i < diceNumber; i++) { try { PersoMouv = true; movePlayerNextCase(); sleep(800); } catch (InterruptedException e) { e.printStackTrace(); } } PersoMouv = false; } }; personnage.start(); } }