Tutoriel 7: projet pong minimal #
Étape 1) créer le projet pong07 à partir de dep07
#
-
Dans un GitBash à la racine du dépôt Git
$ cp -rf dep07 pong07 -
Modifier
settings.gradlepour ajouter l’includeinclude 'pong07' -
Vérifier que
pong07s’exécute$ sh gradlew pong07 -
Dans VSCode, faire un clean workspace pour afficher le projet
pong06
Étape 2) modifier le Monde2d et ses objets #
Créer un enum Position pour différencier les palettes GAUCHE et DROITE
#
-
Créer le paquet
commun.enums -
Dans le paquet
commun.enums, créer l’enumPositionpublic enum Position { GAUCHE, DROITE; }
Créer un enum ActionJoueur pour les actions du joueur
#
-
Dans le paquet
commun.enums, créer l’enumActionJoueurpublic enum ActionJoueur { MONTER, DESCENDRE, ARRETER; }
Créer la classe Palette2d
#
-
Dans le paquet
commun.monde2d, créer la classePalette2d -
Ajuster la signature de la classe:
public class Palette2d extends Object2dFx { // ... -
Avec Ctrl+., ajouter l’import de
Object2dFx -
Avec Ctrl+., créer les méthodes obligatoires
-
s’assurer de retirer l’exception ajoutée par VSCode
public class Palette2d extends Object2dFx { @Override public void onAddedToWorld() { } @Override public void drawOnWorld(GraphicsContext gc) { } @Override protected boolean onMouseEvent(World2dMouseEventFx mouseEvent) { return false; } }
-
-
Ajouter un constructeur où on commence à initialiser la palette
public class Palette2d extends Object2dFx { private Position position; public Palette2d(Position position) { super(); this.position = position; setWidth(20); setHeight(100); } // ... -
Dans la méthode
onAddedToWorld, positionner la palette au bon endroit@Override public void onAddedToWorld() { if(position == Position.GAUCHE) { setTopLeftX(10); }else { setTopLeftX(getWorldWidth() - getWidth() - 10); } setTopLeftY(getWorldHeight()/2 - getHeight()/2); } -
Dans la méthode
drawOnWorld, ajouter le code pour dessiner la palette@Override public void drawOnWorld(GraphicsContext gc) { gc.setFill(Color.BLACK); gc.fillRect(getTopLeftX(), getTopLeftY(), getWidth(), getHeight()); }
Classe MondeDepart2d
#
-
Ajouter des attributs pour les palettes
public class MondeDepart2d extends World2dFx { Palette2d paletteGauche = new Palette2d(Position.GAUCHE); Palette2d paletteDroite = new Palette2d(Position.DROITE); // ... -
Modifier le constructeur
public class MondeDepart2d extends World2dFx { // ... public MondeDepart2d() { super(); addObject2d("balle", 2, new Balle2d(paletteGauche, paletteDroite)); addObject2d("gauche", 2, paletteGauche); addObject2d("droite", 2, paletteDroite); addObject2d("terrain",1, new Terrain2dDepart()); } // ... -
Avec Ctrl+. créer le constructeur pour
Balle2d
Classe Balle2d
#
-
Ajouter des attributs, modifier le constructeur
public class Balle2d extends Object2dFx { private static final double CONST_A = 900; private static final double CONST_B = 0.8; // ajouter les attributs private Palette2d paletteGauche; private Palette2d paletteDroite; public Balle2d(Palette2d paletteGauche, Palette2d paletteDroite) { super(); this.paletteGauche = paletteGauche; this.paletteDroite = paletteDroite; setWidth(20); setHeight(20); } -
Créer la méthode
lancerBalleprivate void lancerBalle() { setTopLeftX(30); setTopLeftY(30); setSpeedX(200); setSpeedY(150); } -
Modifier la méthode
onAddedToWorld@Override public void onAddedToWorld() { lancerBalle(); }
Vérifier l’état courant du projet #
-
Dans un GitBash à la racine du dépôt Git
$ sh gradlew pong07
Classe Balle2d
#
-
Changer comment la balle se comporte:
@Override public void onTimePasses(double secondsElapsed) { super.onTimePasses(secondsElapsed); if(balleFrappeMurGauche()) { lancerBalle(); }else if(balleFrappeMurDroit()) { lancerBalle(); }else if(balleFrappePalette(paletteGauche)) { balleRebondiSurPalette(paletteGauche); }else if(balleFrappePalette(paletteDroite)) { balleRebondiSurPalette(paletteDroite); }else if(balleFrappePlafond()) { balleRebondiSurPlafond(); }else if(balleFrappePlancher()) { balleRebondiSurPlancher(); } } private void balleRebondiSurPlancher() { setTopLeftY(getWorldHeight() - getHeight()); setSpeedY(-1 * getSpeedY()); } private boolean balleFrappePlancher() { return getTopLeftY() + getHeight() > getWorldHeight(); } private void balleRebondiSurPlafond() { setTopLeftY(0); setSpeedY(-1 * getSpeedY()); } private boolean balleFrappePlafond() { return getTopLeftY() < 0; } private void balleRebondiSurPalette(Palette2d palette) { if(palette == paletteGauche) { setTopLeftX(palette.getTopLeftX() + palette.getWidth()); }else { setTopLeftX(palette.getTopLeftX() - getWidth()); } setSpeedX(-1 * getSpeedX()); } private boolean balleFrappePalette(Palette2d palette) { return collidesWith(palette); } private boolean balleFrappeMurDroit() { return getTopLeftX() + getWidth() > getWorldWidth(); } private boolean balleFrappeMurGauche() { return getTopLeftX() < 0; }
Vérifier l’état courant du projet #
-
Dans un GitBash à la racine du dépôt Git
$ sh gradlew pong07
Réagir aux actions des joueurs (comme dans dep07_extra01)
#
-
Dans le paquet
frontal.evenements, créer la classeEvtBougerPalettepublic class EvtBougerPalette extends Event { private Position position; private ActionJoueur actionJoueur; public EvtBougerPalette setPosition(Position position) { this.position = position; return this; } public EvtBougerPalette setActionJoueur(ActionJoueur actionJoueur) { this.actionJoueur = actionJoueur; return this; } //... -
Dans
VueB, ajouter le code pour gérer les touches:public class VueB extends ViewFx { // ... @Override public void initialize() { // ... rootNode().setFocusTraversable(true); rootNode().requestFocus(); rootNode().addEventFilter(KeyEvent.KEY_PRESSED, evtFx -> { if(evtFx.getCode().equals(KeyCode.W)) { Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.GAUCHE) .setActionJoueur(ActionJoueur.MONTER) .trigger(); } else if(evtFx.getCode().equals(KeyCode.S)) { Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.GAUCHE) .setActionJoueur(ActionJoueur.DESCENDRE) .trigger(); } else if(evtFx.getCode().equals(KeyCode.UP)) { Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.DROITE) .setActionJoueur(ActionJoueur.MONTER) .trigger(); } else if(evtFx.getCode().equals(KeyCode.DOWN)) { Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.DROITE) .setActionJoueur(ActionJoueur.DESCENDRE) .trigger(); } }); rootNode().addEventFilter(KeyEvent.KEY_RELEASED, evtFx -> { Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.GAUCHE) .setActionJoueur(ActionJoueur.ARRETER) .trigger(); Ntro.newEvent(EvtBougerPalette.class) .setPosition(Position.DROITE) .setActionJoueur(ActionJoueur.ARRETER) .trigger(); }); } -
Dans
TachesE, ajouter la tache pour capter l’événement:public class TachesE { public static void creerTaches(FrontendTasks tasks) { creerDonneesVueB(tasks); tasks.taskGroup("TachesE") .waitsFor(created(DonneesVueB.class)) .contains(subTasks -> { tacheE2(subTasks); bougerPalette(subTasks); // ajouter }); } // ... // ajouter private static void bougerPalette(FrontendTasks tasks) { tasks.task("bougerPalette") .waitsFor("tacheC2") .waitsFor(created(DonneesVueB.class)) .waitsFor(event(EvtBougerPalette.class)) .executes(inputs -> { EvtBougerPalette evtBougerPalette = inputs.get(event(EvtBougerPalette.class)); DonneesVueB donneesVueB = inputs.get(created(DonneesVueB.class)); evtBougerPalette.bougerPalette(donneesVueB); }); } -
Avec Ctrl+., créer la méthode
EvtBougerPalette.bougerPalettepublic class EvtBougerPalette extends Event { // ... public void bougerPalette(DonneesVueB donneesVueB) { donneesVueB.bougerPalette(position, actionJoueur); } -
Avec Ctrl+., créer la méthode
DonneesVueB.bougerPalettepublic class DonneesVueB implements ViewData { // ... public void bougerPalette(Position position, ActionJoueur actionJoueur) { monde2d.bougerPalette(position, actionJoueur); } -
Avec Ctrl+., créer la méthode
MondeDepart2d.bougerPalettepublic class MondeDepart2d extends World2dFx { // ... public void bougerPalette(Position position, ActionJoueur actionJoueur) { if(position == Position.GAUCHE) { paletteGauche.bouger(actionJoueur); }else { paletteDroite.bouger(actionJoueur); } } -
Avec Ctrl+., créer la méthode
Palette2d.bougerpublic class Palette2d extends Object2dFx { // ... public void bouger(ActionJoueur actionJoueur) { if(actionJoueur == ActionJoueur.MONTER) { setSpeedY(-200); } else if(actionJoueur == ActionJoueur.DESCENDRE) { setSpeedY(+200); } else { setSpeedY(0); } }
Vérifier l’état courant du projet #
-
Dans un GitBash à la racine du dépôt Git
$ sh gradlew pong07- NOTE: voir
dep07_extra02pour une gestion améliorée des touches du clavier
- NOTE: voir