User Tools

Site Tools


2016_2017:s2:td:td_jeux

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 :

  1. vous apprendre à modéliser et programmer une application,
  2. 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.

  1. On veut pouvoir jouer en déplaçant la raquette de la gauche vers la droite ou de bas en haut et inversement.
  2. 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.
  3. 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

  1. Dessiner les grands cas d'utilisation de votre jeu, (Dans le cas 3, proposer votre propre interprétation, mais soyez claire)
  2. Donner leur des priorités d'un point de vue “utilisateur” (e.g. est-il plus important de jouer ou de stocker le score?).
  3. 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

  1. 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…)1)
  • 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

Vous devrez peut etre ajuster le code donné ci-dessous avec votre code.

Voici les codes

Voici comment il fonctionne….

Questions

  1. Comprenez le modèle de ces codes.
    1. A votre avis pourquoi avons-nous des objets BallUI et RacquetUI ?
  2. Chargez les codes correspondant.
    1. Attention dans la classe Game, ajouter en première ligne de la méthode paint : super.paint(g);
  3. 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 2) !

Paramétrage du jeu

Questions :

  1. Comment faire pour accélérer la balle ? …. Tester.
  2. Comment faire pour accélérer la balle en fonction du nombre de fois que vous tapez la balle…?
  3. N'oubliez pas de mettre à jour votre modèle.
  4. Complétez votre application pour gérer un niveau de jeu évolutif.
  5. Modifier la raquette pour pouvoir la déplacer vers le haut et vers le bas.

Une application

A présent Questions :

  1. Choisissez les fonctionnalités à mettre en oeuvre.
  2. 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;
    }
1)
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 !!
2)
On n'a plus amusant à faire
2016_2017/s2/td/td_jeux.txt · Last modified: 2017/03/13 11:35 by blay