Tutoriel 5: projet pong minimal #
Étape 1) créer le projet pong05 à partir de dep05
#
-
Dans un GitBash à la racine du dépôt Git
$ cp -rf dep05 pong05 -
Modifier
settings.gradlepour ajouter l’includeinclude 'pong05' -
Vérifier que
pong05s’exécute$ sh gradlew pong05 -
Dans VSCode, faire un clean workspace pour afficher le projet
pong05
Étape 2) implanter le bon modèle #
-
Avec F2, renommer la classe
ModeleA=>ModeleFileAttente
-
Avec F2, renommer la classe
ValeurA=>PartieEnFile
-
Modifier
ModeleFileAttenteselon le document de conception:public class ModeleFileAttente implements Model, WatchJson, WriteObjectGraph { private int prochainId = 0; private List<PartieEnFile> parties = new ArrayList<>(); // ... -
Modifier
ModeleFileAttente.methodeAavec des valeurs temporairespublic void methodeA(String paramA, int paramB) { parties.add(new PartieEnFile(String.valueOf(prochainId++), null, paramA, paramB, null, null, 0)); } -
Modifier
ModeleFileAttente.toStringpublic String toString() { StringBuilder builder = new StringBuilder(); builder.append("prochainId: " + prochainId); builder.append(System.lineSeparator()); builder.append(System.lineSeparator()); builder.append("parties: "); builder.append(System.lineSeparator()); for(PartieEnFile valeur : parties) { builder.append(" "); builder.append(valeur.toString()); builder.append(System.lineSeparator()); } return builder.toString(); } -
Modifier
PartieEnFileselon le document de conception:public class PartieEnFile implements ModelValue { private String idPartie; private String idJoueurA; private String nomJoueurA; private int scoreJoueurA; private String idJoueurB; private String nomJoueurB; private int scoreJoueurB; // ... -
Modifier le constructeur:
public PartieEnFile(String idPartie, String idJoueurA, String nomJoueurA, int scoreJoueurA, String idJoueurB, String nomJoueurB, int scoreJoueurB) { this.idPartie = idPartie; this.idJoueurA = idJoueurA; this.nomJoueurA = nomJoueurA; this.scoreJoueurA = scoreJoueurA; this.idJoueurB = idJoueurB; this.nomJoueurB = nomJoueurB; this.scoreJoueurB = scoreJoueurB; } -
Modifier
PartieEnFile.toString@Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append(nomJoueurA); builder.append(" Vs "); if(nomJoueurB == null){ builder.append("???"); }else{ builder.append(nomJoueurB); } builder.append(" "); builder.append(scoreJoueurA); builder.append("-"); builder.append(scoreJoueurB); return builder.toString(); }
Vérifier l’état courant du projet #
-
Dans un GitBash à la racine du dépôt Git
$ sh gradlew pong05
Étape 3) implanter le bon message #
-
Avec F2, renommer la classe
MsgA=>MsgAjouterPartie
-
Modifier les attributs du message
public class MsgAjouterPartie extends Message<MsgAjouterPartie> { private String idJoueurA; private String nomJoueurA; private int scoreJoueurA; private String idJoueurB; private String nomJoueurB; private int scoreJoueurB; -
Avec Ctrl+., générer les setters
public void setIdJoueurA(String idJoueurA) { this.idJoueurA = idJoueurA; } public void setNomJoueurA(String nomJoueurA) { this.nomJoueurA = nomJoueurA; } public void setScoreJoueurA(int scoreJoueurA) { this.scoreJoueurA = scoreJoueurA; } public void setIdJoueurB(String idJoueurB) { this.idJoueurB = idJoueurB; } public void setNomJoueurB(String nomJoueurB) { this.nomJoueurB = nomJoueurB; } public void setScoreJoueurB(int scoreJoueurB) { this.scoreJoueurB = scoreJoueurB; } -
Adapter les setters pour retourner
thispublic MsgAjouterPartie setIdJoueurA(String idJoueurA) { this.idJoueurA = idJoueurA; return this; } public MsgAjouterPartie setNomJoueurA(String nomJoueurA) { this.nomJoueurA = nomJoueurA; return this; } public MsgAjouterPartie setScoreJoueurA(int scoreJoueurA) { this.scoreJoueurA = scoreJoueurA; return this; } public MsgAjouterPartie setIdJoueurB(String idJoueurB) { this.idJoueurB = idJoueurB; return this; } public MsgAjouterPartie setNomJoueurB(String nomJoueurB) { this.nomJoueurB = nomJoueurB; return this; } public MsgAjouterPartie setScoreJoueurB(int scoreJoueurB) { this.scoreJoueurB = scoreJoueurB; return this; } -
Modifier l’appel à la
methodeA
-
Utiliser Ctrl+. pour modifier la signature de la
methodeA:
-
Finaliser le code de
ModeleFileAttente.methodeApublic void methodeA(String idJoueurA, String nomJoueurA, int scoreJoueurA, String idJoueurB, String nomJoueurB, int scoreJoueurB) { parties.add(new PartieEnFile(String.valueOf(prochainId++), idJoueurA, nomJoueurA, scoreJoueurA, idJoueurB, nomJoueurB, scoreJoueurB)); } -
Modifier la création du message dans la
VueAboutonB.setOnAction(evtFx -> { Ntro.newMessage(MsgAjouterPartie.class) .setNomJoueurA(MaquetteDepart.chaineAuHasard()) .setScoreJoueurA(MaquetteDepart.entierAuHasard()) .setNomJoueurB(MaquetteDepart.chaineAuHasard()) .setScoreJoueurB(MaquetteDepart.entierAuHasard()) .send(); });
Vérifier l’état courant du projet #
-
Dans un GitBash à la racine du dépôt Git
$ sh gradlew pong05
Étape 4) adapter MaquetteDepart
#
-
Avec F2, renommer la classe
MaquetteDepart=>MaquettePartie
-
Modifier le code de
MaquetteDepartpublic class MaquettePartie { private static String idJoueur = "alice"; public static String idJoueur() { List<String> choixDeId = List.of("alice", "bob", "chaaya", "dominic", "élisabeth", "firas", "gregson", "mehdi", "louis", "marcel", "ashwin", "ichiro", "jun"); idJoueur = Ntro.random().choice(choixDeId); return idJoueur; } public static String nomJoueur() { return idJoueur.substring(0,1).toUpperCase() + idJoueur.substring(1); } public static int scoreAuHasard() { return Ntro.random().nextInt(10); } } -
Modifier l’envoi du message dans
VueAboutonB.setOnAction(evtFx -> { Ntro.newMessage(MsgAjouterPartie.class) .setIdJoueurA(MaquettePartie.idJoueur()) .setNomJoueurA(MaquettePartie.nomJoueur()) .setScoreJoueurA(MaquettePartie.scoreAuHasard()) .setIdJoueurB(MaquettePartie.idJoueur()) .setNomJoueurB(MaquettePartie.nomJoueur()) .setScoreJoueurB(MaquettePartie.scoreAuHasard()) .send(); });
Étape 5) adapter les vues #
Modifier les fichiers .properties
#
-
fr.propertiesajouter=Ajouter jouer=Jouer quitter=Quitter partie -
en.propertiesajouter=Add jouer=Play quitter=Exit Game
Adapter le fichier vue_a.fxml
#
-
Modifier les
%vardes boutons<Button fx:id="boutonA" text="%jouer" /> <!-- modifier --> <!-- ... --> <Button fx:id="boutonB" text="%ajouter" /> <!-- modifier -->
Adapter le fichier vue_b.fxml
#
-
Retirer le Label et modifier le
%vardu bouton<!-- ... --> <Label styleClass="label" text="%texteA"> </Label> <!-- retirer --> <Pane styleClass="espacement,moyen"/> <!-- retirer --> <Button fx:id="boutonQuitter" text="%quitter"> </Button> <!-- modifier -->
Ajouter un fichier prod.css et le déclarer dans FrontalPong.java
#
-
Télécharger le fichier prod.css et le copier dans
pong04/src/main/resources/style -
Dans
FrontalPong.java, modifier la déclaration du CSS://registrar.registerStylesheet("/style/dev.css"); registrar.registerStylesheet("/style/prod.css");
Vérifier le comportement et l’affichage #
-
Effacer le modèle actuel
$ rm -rf pong05/_storage/models -
Démarrer avec un modèle vide
$ sh gradlew pong05