Optionnel: créer un ModelePartie
#
Modèle et valeur pour mémoriser le score #
-
Dans
valeurs
, créer la classe suivantepublic class InfoJoueur implements ModelValue { private Joueur joueur = null; private int score = 0; public InfoJoueur(Joueur joueur) { this.joueur = joueur; } public void afficherSur(VuePartie vuePartie, Position position) { vuePartie.afficherScore(position, score); joueur.afficherSur(vuePartie, position); } }
-
Dans
modeles
, créer la classe suivantepublic class ModelePartie implements Model { private String idRendezVous = null; private Map<Position, InfoJoueur> infoJoueurParPosition = new HashMap<>(); public ModelePartie(){ ajouterJoueur(Position.GAUCHE, MaquetteJoueurs.joueurAleatoire()); ajouterJoueur(Position.DROITE, MaquetteJoueurs.joueurAleatoire()); } public ModelePartie setIdRendezVous(String idRendezVous) { this.idRendezVous = idRendezVous; return this; } public ModelePartie ajouterJoueur(Position position, Joueur joueur) { infoJoueurParPosition.put(position, new InfoJoueur(joueur)); return this; } // ...
-
Avec
registrar.registerModel
, déclarer le modèle et la valeur dansAppPong
public class AppPong implements NtroAppFx { // ... @Override public void registerModels(MessageRegistrar registrar) { // ... registrar.registerModel(ModelePartie.class); registrar.registerValue(InfoJoueur.class); } // ...
Code pour afficher le score #
-
Dans
partie.xml
, ajouter le FXML pour afficher les noms et le pointage<!-- ... --> <HBox styleClass="conteneur"> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> <!-- ajouter --> <Label fx:id="labelNomPremierJoueur" styleClass="gros-texte"> </Label> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> <!-- ajouter --> <Label fx:id="labelScorePremierJoueur" styleClass="gros-texte"> </Label> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> <Button fx:id="boutonQuitterPartie" text="%quitterPartie" styleClass="gros-bouton" id="bouton-quitter-partie"> </Button> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> <!-- ajouter --> <Label fx:id="labelScoreDeuxiemeJoueur" styleClass="gros-texte"> </Label> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> <!-- ajouter --> <Label fx:id="labelNomDeuxiemeJoueur" styleClass="gros-texte"> </Label> <Pane HBox.hgrow="ALWAYS" styleClass="grand-espace-horizontal"/> </HBox> <!-- ... -->
-
Dans
VuePartie
, ajouter le code suivantpublic class VuePartie extends ViewFx { // ... @FXML private Label labelNomPremierJoueur; @FXML private Label labelNomDeuxiemeJoueur; @FXML private Label labelScorePremierJoueur; @FXML private Label labelScoreDeuxiemeJoueur; private Map<Position, Label> labelsNoms = new HashMap<>(); private Map<Position, Label> labelsScores = new HashMap<>(); // ... @Override public void initialize() { // ... Ntro.assertNotNull(labelNomPremierJoueur); Ntro.assertNotNull(labelNomDeuxiemeJoueur); labelsNoms.put(Position.GAUCHE, labelNomPremierJoueur); labelsNoms.put(Position.DROITE, labelNomDeuxiemeJoueur); Ntro.assertNotNull(labelScorePremierJoueur); Ntro.assertNotNull(labelScoreDeuxiemeJoueur); labelsScores.put(Position.GAUCHE, labelScorePremierJoueur); labelsScores.put(Position.DROITE, labelScoreDeuxiemeJoueur); // ... } // ... public void afficherNomJoueur(Position position, String nom) { Label labelNom = labelsNoms.get(position); labelNom.setText(nom); } public void afficherScore(Position position, int score) { Label labelScore = labelsScores.get(position); labelScore.setText(String.valueOf(score)); }
-
Dans
AfficherPartie
, ajouter la tâche suivantepublic class AfficherPartie { public static void creerTaches(FrontendTasks tasks) { creerDonneesVuePartie(tasks); tasks.taskGroup("AfficherPartie") .waitsFor("afficherVuePartie") .waitsFor(created(DonneesVuePartie.class)) .contains(subTasks -> { // ... // ajouter afficherInfoPartie(subTasks); }); } // ... private static void afficherInfoPartie(FrontendTasks subTasks) { subTasks.task("afficherInfoPartie") .waitsFor(modified(ModelePartie.class)) .waitsFor(created(VuePartie.class)) .executes(inputs -> { Modified<ModelePartie> partie = inputs.get(modified(ModelePartie.class)); VuePartie vuePartie = inputs.get(created(VuePartie.class)); partie.currentValue().afficherSur(vuePartie); }); }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
ModelePartie.afficherSur
-
Dans
ModelePartie
, ajouter le code pour afficherpublic class ModelePartie implements Model { // ... // public void afficherSur(VuePartie vuePartie) { for(Map.Entry<Position, InfoJoueur> entry : infoJoueurParPosition.entrySet()) { Position position = entry.getKey(); InfoJoueur infoJoueur = entry.getValue(); infoJoueur.afficherSur(vuePartie, position); } }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
InfoJoueur.afficherSur
-
Dans
InfoJoueur
, ajouter le code pour afficherpublic class InfoJoueur implements ModelValue { // ... public void afficherSur(VuePartie vuePartie, Position position) { vuePartie.afficherScore(position, score); joueur.afficherSur(vuePartie, position); }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
Joueur.afficherSur
-
Dans
Joueur
, ajouter le code pour afficherpublic class Joueur implements ModelValue { public void afficherSur(VuePartie vuePartie, Position position) { vuePartie.afficherNomJoueur(position, nomCourt()); }
-
Vérifier que ça fonctionne
$ sh gradlew pong
Message pour ajouter un point #
-
Dans
messages
, ajouter la classe suivantepublic class MsgAjouterPoint extends Message<MsgAjouterPoint> { private Position position; public MsgAjouterPoint setPosition(Position position) { this.position = position; return this; } }
-
Avec
registrar.registerMessage
, déclarer le message dansAppPong
public class AppPong implements NtroAppFx { // ... @Override public void registerMessages(MessageRegistrar registrar) { // ... registrar.registerMessage(MsgAjouterPoint.class); }
-
Dans
dorsal.taches
, ajouter la classe suivante// ... import static ca.ntro.app.tasks.backend.BackendTasks.*; public class ModifierPartie { public static void creerTaches(BackendTasks tasks) { tasks.taskGroup("ModifierPartie") .waitsFor(model(ModelePartie.class)) .contains(subTasks -> { ajouterPoint(subTasks); }); } private static void ajouterPoint(BackendTasks tasks) { tasks.task("ajouterPoint") .waitsFor(model(ModelePartie.class)) .waitsFor(message(MsgAjouterPoint.class)) .executes(inputs -> { MsgAjouterPoint msgAjouterPoint = inputs.get(message(MsgAjouterPoint.class)); ModelePartie partie = inputs.get(model(ModelePartie.class)); msgAjouterPoint.ajouterPointA(partie); }); } }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
MsgAjouterPoint.ajouterPointA
public class MsgAjouterPoint extends Message<MsgAjouterPoint> { // ... // remplir la méthode public MsgAjouterPoint ajouterPointA(ModelePartie partie) { partie.ajouterPointPour(position); return this; }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
ModelePartie.ajouterPointPour
public class ModelePartie implements Model { // ... // remplir la méthode public void ajouterPointPour(Position position) { InfoJoueur infoJoueur = infoJoueurParPosition.get(position); if(infoJoueur != null) { infoJoueur.incrementerScore(); } }
-
Utiliser Ctrl+.Eclipse: Ctrl+1 pour créer la méthode
InfoJoueur.incrementerScore
public class InfoJoueur implements ModelValue { // ... // remplir la méthode public void incrementerScore() { score++; }
-
Appeler
ModifierPartie.creerTaches()
dansDorsalPong
public class DorsalPong extends LocalBackendNtro { @Override public void createTasks(BackendTasks tasks) { // ... ModifierPartie.creerTaches(tasks); } // ...
-
Vérifier le graphe du dorsal
-
Dans
Balle2d
, ajouter le code pour compter des pointspublic class Balle2d extends ObjetPong2d { // ... @Override public void initialize() { setWidth(10); setHeight(10); choisirEtatInitial(); } private void choisirEtatInitial() { setTopLeftY(10); setSpeedY(100 + Ntro.random().nextInt(20)); if(Ntro.random().nextBoolean()) { setTopLeftX(100); setSpeedX(100 + Ntro.random().nextInt(20)); }else { setTopLeftX(MondePong2d.LARGEUR_MONDE - 100 - getWidth()); setSpeedX(-100 - Ntro.random().nextInt(20)); } } @Override public void onTimePasses(double secondsElapsed) { super.onTimePasses(secondsElapsed); if(balleFrappeMurGauche()) { // modifier choisirEtatInitial(); ajouterPoint(Position.DROITE); } else if(balleFrappeMurDroit()) { // modifier choisirEtatInitial(); ajouterPoint(Position.GAUCHE); } // ... } // ajouter private void ajouterPoint(Position position) { Ntro.newMessage(MsgAjouterPoint.class) .setPosition(position) .send(); }
-
Vérifier que ça fonctionne
Problème: ModelePartie
a pas les bons noms de joueurs!
#
-
Les joueurs sont choisi au hasard dans le constructeur de
ModelePartie
- on devrait plutôt reprendre les mêmes joueurs que le rendez-vous
-
On va régler ce problème au module 9