Bonjour,
Dans le cadre d'un projet scolaire, je modélise une machine de Turing à l'aide de JavaFX.
J'utilise pour ce faire toute une panoplie d'animations dépendantes les unes des autres et pour l'instant, je n'arrive pas à les synchroniser correctement.
J'ai pour l'instant diviser mon code en deux méthodes.
La première permet de gérer un événement en créant une boucle qui, à chaque passage lance une animation dépendant de la précédente. Je dis "dépend", parce que l'exécution de l'animation précédente met à jour certaines variables nécessaire à la création de l'animation en cours. Graphiquement, à chaque tour de boucle, je voudrait déplacer mon curseur, changer la couler de deux bulles différentes (une en bleu, une en rouge) et changer un label. J'ai regrouper c'est 4 (+ une pause) animations à l'aide d'une transitions séquentielle.
La deuxième (appelée par la première) permet d'initialiser ces variables et de créer l'animation. J'ai rajouter quelques commentaires dans mon code pour que vous compreniez plus ou moins ce que fait chaque partie. Je tiens à préciser que les tableaux utilisés sont définis dans d'autres méthodes et que mon code compile (sauf quand il veut lancer une animation avec de valeurs pas à jour).
Voici en plus deux variables déclarées globalement:
private int state;
private int posRuban;
Méthode 1:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public void handleRemoteAction(ActionEvent event) throws IOException{ state = 0; posRuban = 0; SequentialTransition animation; if(event.getSource()==play){ //mon événement déclencheur while(state < transitions.length-1){ //L'appel renvoie une nouvelle annimation à chaque passage //dans la boucle et incrémente "state" animation = initAnimation(); animation.play(); } } }
Méthode 2:
D'après mes observations, en ce moment il exécute d'abord toutes les animations de type 1, puis toutes celles de type 2, etc... Au lieu de faire 1,2,3,4,5,1,2,3,4,5...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public SequentialTransition initAnimation() { String value; NextMove move; int v = -1; final int j = posRuban; final int exState; final int newState; final String newVal; //Déclaration de l'animation principale. final SequentialTransition masterAnimation = new SequentialTransition(); //Déclaration des 5 types d'animations secondaires. final PauseTransition rest = new PauseTransition(Duration.seconds(10)); final TranslateTransition shift = new TranslateTransition(Duration.seconds(2), cursor); final Transition changeRubanValue; final Transition changeExStateColor; final Transition changeNewStateColor; value = ruban[posRuban].getValueLabel(); // Création de l'animation de type 1. exState = state; changeExStateColor = new Transition(){ {setCycleDuration(Duration.seconds(5));} public void interpolate(double frac) {bulles[exState].setFill(Color.RED);} }; //Mise à jour des différentes variables for (int incr=0; incr < variables.length; incr++){ if (value.equals(variables[incr])){v = incr;} } move = (transitions[state][v]); value = move.getVar(); state = move.getState(); // Création de l'animation de type 2. newVal = value ; changeRubanValue = new Transition(){ {setCycleDuration(Duration.seconds(2));} public void interpolate(double frac) {ruban[j].setValueLabel(newVal);} }; // Paramétrisation de l'animation de type 3. if (move.getDir()){ shift.setByX(70); posRuban = posRuban + 1;} else{ shift.setByX(-70);; posRuban = posRuban - 1; }; // Création de l'animation de type 4. newState = state; changeNewStateColor = new Transition(){ {setCycleDuration(Duration.seconds(2));} public void interpolate(double frac) {bulles[newState].setFill(Color.AQUA);} }; // ajout des animations de type 1,2,3,4 et 5 à l'animation principale. changeNewStateColor.setOnFinished(ActionEvent -> changeRubanValue.play()); changeRubanValue.setOnFinished(ActionEvent -> changeExStateColor.play()); masterAnimation.getChildren().addAll(changeNewStateColor,shift,rest); //Renvoie l'animation principale. return masterAnimation; }
Merci d’avance à toute personne qui me fournira un élément de réponse!
Partager