Problème avec Thread.sleep() dans JavaFX
Bonjour tout le monde,
Je suis entrain de réaliser une mini-application du jeu de la bataille, et je bloque alors l'affiche des cartes.
J'aimerai faire en sorte que toute les 1 ou 2 secondes les cartes se mette à jour pour laissez le tempsà notre d'apercevoir les changements et l'avancement de la partie.
Seulement voila , j'ai tenté d'utiliser une Thread.sleep() mais je me retrouve avec quelque de très contre intuitif:
- dans mon code j'ai un débugger qui m'affiche l'etat de la partie, et il s'affiche bien toute les 2 secondes
- mais dans le même try catch avec le Thread, j'ai une instruction devant effecteur le mise à jour des cartes; et voila le plus bizarre, les images ne s'actualise pas durant le temps de mes delay, elle s'actualise seulemnt une fois à la fin de ma boucle sur le try catch.
Voila mon code de la bataille:
Code:
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
package sample;
import java.awt.image.AreaAveragingScaleFilter;
import java.util.ArrayList;
/**
* War card game entity
*/
public class War {
/**
* Player1
*/
private Player player1;
/**
* Player2
*/
private Player player2;
/**
* Carpet
*/
private Carpet carpet;
/**
* Card box
*/
private CardBox cardBox;
protected Controller controller;
/**
* War card game constructor
* @param controller
*/
public War(Controller controller, Player player1, Player player2) {
this.player1 = player1;
this.player2 = player2;
this.carpet = new Carpet();
this.cardBox = new CardBox();
this.controller = controller;
}
/**
* Start the game
*/
public ArrayList<String> nextTurn() {
/////
System.out.println("------ WAR CARD GAME ------\n");
/////
ArrayList<String> listInformations = new ArrayList<>();
// Check there are all the cards in the card box
this.cardBox.init();
// Deal cards
this.cardBox.shuffle();
dealCards(player1, 3);
dealCards(player2, 3);
// Start game
int numberTurn = 1;
do {
// Shuffle decks every 5 turns to avoid infinity loop
if (numberTurn % 5 == 0) {
this.player1.shuffleDeck();
this.player2.shuffleDeck();
System.out.println("Decks shuffled\n");
}
// Players decks
this.player1.showHand();
this.player2.showHand();
// Players reveal their card
listInformations.add(player1PlayedCardPath());
listInformations.add(player2PlayedCardPath());
this.carpet.revealCard(player1.play());
this.carpet.revealCard(player2.play());
// See game
this.carpet.display();
// Result
switch (this.carpet.compareCards()) {
case DRAW:
System.out.println("Draw\n");
break;
case PLAYER1_WIN:
this.player1.winTurn(carpet.takeAllCards());
break;
case PLAYER2_WIN:
this.player2.winTurn(carpet.takeAllCards());
break;
}
numberTurn ++;
} while (this.player1.numberOfCards() != 0 && this.player2.numberOfCards() != 0);
return listInformations;
}
/**
* Deal cards to a player
* @param player a player
* @param nbCards a number of cards
*/
private void dealCards(Player player, int nbCards) {
for (int i = 0; i < nbCards; i++) {
player.pickRandomCard(this.cardBox);
}
}
public String player1PlayedCardPath() {
int value = this.player1.getNextCard().getCardValue();
String suit = this.player1.getNextCard().getCardSuit();
return "imgCard/"+value+suit+".png";
}
public String player2PlayedCardPath() {
int value = this.player2.getNextCard().getCardValue();
String suit = this.player2.getNextCard().getCardSuit();
return "imgCard/"+value+suit+".png";
}
} |
Ainsi que du Controller:
Code:
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
public class Controller extends Thread implements Initializable {
@FXML
private ImageView deckPlayer1;
@FXML
private ImageView deckPlayer2;
@FXML
private ImageView playedCardPlayer1;
@FXML
private ImageView playedCardPlayer2;
@FXML
private AnchorPane window;
@FXML
private AnchorPane gameFrame;
@FXML
private Label namePlayer1;
@FXML
private Label namePlayer2;
@FXML
private Label nbCardPlayer1;
@FXML
private Label nbCardPlayer2;
@FXML
private Label stateGamePlayer1;
@FXML
private Label stateGamePlayer2;
@FXML
private Button button;
private Player player1 = new Player("Thomas");
private Player player2 = new Player("Théo");
private War war;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
initDeckImage();
initPlayerLabel();
button.setText("Jouez !");
this.war = new War(this, this.player1, this.player2);
}
@FXML
public void start() {
button.setVisible(false);
this.game();
}
public void game() {
Thread thread = new Thread();
for (int i = 0; i < 3; i++) {
try {
updateView(this.war.nextTurn());
thread.sleep(2000);
}
catch (Exception e) {}
}
}
public void updateView(ArrayList<String> infos) {
setPlayedCardPlayer1(infos.get(0));
setPlayedCardPlayer2(infos.get(1));
}
private void initDeckImage() {
try {
FileInputStream input = new FileInputStream("imgCard/red_back.png");
Image image = new Image(input);
deckPlayer1.setImage(image);
deckPlayer2.setImage(image);
}
catch (IOException e) {
e.printStackTrace();
}
}
private void initPlayerLabel() {
namePlayer1.setText(player1.getName());
namePlayer2.setText(player2.getName());
nbCardPlayer1.setText("26");
nbCardPlayer2.setText("26");
stateGamePlayer1.setText("");
stateGamePlayer2.setText("");
}
public void setPlayedCardPlayer1(String imgPath) {
Image image = new Image("file:" + imgPath);
playedCardPlayer1.setImage(image);
}
public void setPlayedCardPlayer2(String imgPath) {
Image image = new Image("file:" + imgPath);
playedCardPlayer2.setImage(image);
}
} |
Cela fait maintenant plusieurs heures que je n'arrive à rien, si vous pouviez m'aider.
Merci bien.