====== Jeu de Mini-Tennis 4h ====== Allez aussi loin que vous le pouvez ! Nous allons créer un jeu de mini-Tennis. Pour cela, nous nous sommes "grave" inspirés de http://www.edu4java.com/en/game/game3.html. **A LIRE** Seulement nous allons développé une **solution un peu différente**. Si vous choisissez de recopier les codes... tant pis pour vous, mais ne nous ne demandez pas de les corriger ! **Suivez bien les instructions pour ne pas perdre l'objectif pédagogique :** - vous apprendre à modéliser et programmer une application, - vous montrer que vous savez déjà faire beaucoup de choses. Notre objectif n'est pas de vous apprendre à programmer une interface graphique donc les codes correspondants vous sont donnés. Pour la semaine prochaine vous devez préparer le TD suivant qui est la préparation de l'examen de l'an dernier ! ===== Spécifications ===== Voici une image d'une "partie" du jeu que nous allons créer. - On veut pouvoir jouer en déplaçant la raquette de la gauche vers la droite ou de bas en haut et inversement. - On veut gérer plusieurs joueurs : en début de partie tous les joueurs saisissent leur nom, puis ils jouent. On affiche le joueur qui a le meilleur score à la fin de la partie. - On veut gérer plusieurs niveaux de jeu : facile : lenteur du déplacement de la balle; intermédiaire; évolutif : la balle se déplace de plus en plus vite; difficile, la taille de la raquette diminue, etc. **Question 10mn** - Dessiner les grands cas d'utilisation de votre jeu, (Dans le cas 3, proposer votre propre interprétation, mais soyez claire) - Donner leur des priorités d'un point de vue "utilisateur" (e.g. est-il plus important de jouer ou de stocker le score?). - Evaluer la complexité de chaque cas d'utilisation et le temps qu'il vous faudrait. Ecrivez le. Vous vérifierez à la fin du TD à quel point vous êtes prêt ou non de votre évaluation. ** Question 10mn grand maximum** - Concevez un diagramme de classe représentant votre jeu, sur papier. N'y passez pas trop longtemps car ensuite on vous aidera, mais ce diagramme doit vous permettre de confronter votre solution à celle que nous allons vous aider à réaliser. ===== Modélisation et Codage des classes "métier" ===== ** Question : Définir la classe ''Ball''** Une Balle se définit par * un diamètre (un entier), * une position en x et y (Il s'agira de pixel donc des entiers...)((La solution proposée qui s'appuie sur les codes initiaux, n'utilise pas de classe ''Position'' mais vous pouvez très bien en utiliser une dans vos propres classes !!)) * un pas de déplacement en X (deltaX) et un pas de déplacement en Y (e.g. un déplacement deltaX=deltaY et deltaX>0 déplace la balle en diagonale vers le bas de la gauche vers la droite), * déplacer une balle revient à modifier sa position de deltaX et deltaY (x= x+deltaX;y = y+deltaY) * déplacer une balle dans un espace borné en largeur et en hauteur, consiste à modifier son déplacement (deltaX ou deltaY) lorsqu'elle atteint les limites de la zone qui lui est donnée, i.e. * si on sort sur la gauche, alors on repart à droite (deltaX positif); * si on sort sur la droite, alors on repart sur la gauche (négatif) * si on sort par le haut, alors on repart vers le bas (deltaY positif) * si on sort par le bas, alors on repart vers le haut (deltaY négatif) **Définir la classe ''Racquet''** Une Raquette se définit par * une position en x et y * une largeur et une hauteur (des entiers) * un pas de déplacement en x (deltaX) * déplacer une raquette revient à modifier sa position de deltaX * déplacer une raquette dans un espace borné en largeur, consiste à modifier son déplacement de deltaX) uniquement si on reste dans les bornes ===== Modélisation et Codage de l'interface graphique "Basique" ===== Voici le modèle {{:2016_2017:s2:td:capture_d_e_cran_2017-03-06_a_22.01.20.png?300|}} Vous devrez peut etre ajuster le code donné ci-dessous avec votre code. {{:2016_2017:s2:td:tennisgamev0.zip|Voici les codes}} Voici comment il fonctionne.... {{:2016_2017:s2:td:scenario_main.png?300|}} {{:2016_2017:s2:td:scenarioplay.png?300|}} ** Questions** - Comprenez le modèle de ces codes. - A votre avis pourquoi avons-nous des objets ''BallUI'' et ''RacquetUI'' ? - Chargez les codes correspondant. - Attention dans la classe ''Game'', ajouter en première ligne de la méthode paint : ''super.paint(g);'' - Connectez ce code à votre code. Hélas la balle tourne infiniment ! Il faudrait maintenant utiliser la raquette !! ===== Où l'on joue ! ===== Pour pouvoir jouer, vous devez à présent, déplacer la balle en fonction de la position de la raquette. **Questions** * 1 - Définir une méthode dans ''Ball'' qui détecte s'il y a collision avec la raquette. Pour cela, vous assimilez la balle à un carré et vous recherchez l'intersection avec le rectangle (''java.awt.Rectangle'') qui compose la raquette //Dans la classe Ball public Rectangle getBounds() { return new Rectangle(x, y, diameter, diameter); } private boolean collision(Racquet racquet) { return racquet.getBounds().intersects(getBounds()); } * 2 - A présent vous vérifiez si la balle entre en collision avec la raquette et change sa trajectoire ou si elle est passée en dehors de cette zone, par exemple implémenter la méthode suivante : moveInWithRacquet(getWidth(),getHeight(),racquet) * 3 - Evidemment dans le jeu il faut appeler votre nouvelle méthode de déplacement de la balle et gérer le cas où la balle sort des bornes avec un gameOver, par exemple. private void play() { racquet.moveIn(getWidth()); State moveState = ball.moveInWithRacquet(getWidth(),getHeight(),racquet); if (moveState==State.out) gameOver(); ... * 4 - Testez et amusez-vous 1mn ((On n'a plus amusant à faire)) ! ===== Paramétrage du jeu ===== ** Questions : ** - Comment faire pour accélérer la balle ? .... Tester. - Comment faire pour accélérer la balle en fonction du nombre de fois que vous tapez la balle...? - N'oubliez pas de mettre à jour votre modèle. - Complétez votre application pour gérer un niveau de jeu évolutif. - Modifier la raquette pour pouvoir la déplacer vers le haut et vers le bas. ===== Une application ===== A présent ** Questions : ** - Choisissez les fonctionnalités à mettre en oeuvre. - Modifiez votre modèle pour intégrer, les scores, les joueurs, les niveaux de jeux et implémentez les. Pour la semaine prochaine vous devez préparer le TD suivant qui est la préparation de l'examen de l'an dernier ! ====== Boite à outils de code à n'utiliser que si vous n'y êtes pas parvenus tous seuls ====== ==== Gestion des déplacements de la balle si besoin... ==== if (x + deltaX < 0) deltaX = 1; if (x + deltaX > width - diameter) deltaX = -1; if (y + deltaY < 0) deltaY = 1; if (y + deltaY > height - diameter) { moveOK = false; deltaY = -1; } move(); return moveOK; ==== Code de déplacement de la raquette ==== public void moveIn(int width) { if (x + deltaX > 0 && x + deltaX < width - this.width) x = x + deltaX; } ==== Code de déplacement de la balle en relation avec la raquette ==== public State moveInWithRacquet(int width, int height, Racquet racquet) { if (x + deltaX < 0) deltaX = speed; if (x + deltaX > width - diameter) deltaX = -speed; if (y + deltaY < 0) deltaY = speed; if (y + deltaY > height - diameter) { return State.out; } if (this.collision(racquet)){ deltaY = -speed; y = racquet.getY() - diameter; return State.collision; } move(); return State.in; }