Exercices graphiques - Un casse brique

Sprite

Dans un jeu vidéo (genre mario), les éléments qui bougent ou qui interagissent sont des sprites (où un groupe de sprite) que l'on représente souvent comme des rectangles (c'est plus simple).




Sur l'image du Mario on voit différents sprites différents :

  1. Le Mario qui va bouger selon nos ordres et qui respecte une physique (il tombe et ne traverse pas les tuyaux).
  2. L'ennemi qui bouge selon le comportement définie par une "Intelligence artificielle" et qui respecte.
  3. Les tuyaux qui sont fixent (et pourtant il "bougent" à l'écran) et qui interagissent avec Mario et les ennemis.
  4. Les montagnes qui sont du décor et n'interagisse pas avec Mario.
  5. Le nuage qui est un décor qui peut bouger.
  6. Le sol qui est un décor ne bouge pas mais interagie avec Mario.

Tous ses sprites ont des choses en commun, ils ont une position et une taille et des choses qui les différencient (le mouvement par exemple). La programmation objet offre une notion d’héritage qui permet de prendre en compte ses points communs et ses différences (c'est hors programme mais on va en faire un peu au pire on peut faire du copier collé).

Rectangle

On commence par définir une classe rectangle (qui servira de parent aux sprites), on se place dans le repère de la carte et pour uniformiser les choses on choisit pour attributs :

  1. x = L'abscisse du coin supérieure gauche (Dans le repère de la carte).
  2. y = L'ordonnée du coin supérieur gauche (Dans le repère de la carte).
  3. longueur = La longueur horizontale.
  4. hauteur = La hauteur verticale.

Exercices
  1. Compléter les méthodes suivantes :

  1. Récupérer ses attributs.
  2. Savoir si deux rectangles se coupent.
  3. Le dessiner.

Les murs

Par rapport à un rectangle, Le mur est un sprite : il va devoir être affiché dans la fenêtre graphique, grâce au mécanisme d’héritage on n'a pas besoin de refaire les méthodes les autres méthodes (vérifie_colision...) sont les mêmes.

Exercices
  1. Compléter les méthodes suivantes :

Les Briques

Par rapport à un Mur, les briques vont être détruite avec un contact avec une balle. On va donc le faire hériter de Mur et lui donner une vie.

Exercices
  1. Compléter les méthodes suivantes :

Le palet

Le palet est un mur qui se déplace et qui réagit avec l'utilisateur, on va lui rajouter comme attributs sa vitesse (en pixel pour chaque étape de l'animation), ses limites de déplacement l1 et l2 (si vous ne voulez pas qu'il sorte de l'écran), son sens de déplacement (0 : horizontale, 1 : verticale), les touches de ses déplacements (par exemple "up" et "down" ) et un attribut déplacement (qui ne sera pas dans le constructeur) qui vaut soit 0, soit -vitesse, soit + vitesse. On va aussi lui donner comme méthode une fonction update(self) qui va changer sa position et une fonction action(self,evenement) qui va recevoir un événement EZ et modifier eventuellement l’attribut déplacement.

Exercices
  1. Compléter les méthodes suivantes :

La balle

La balle hérite aussi de la classe Rectangle (c'est un choix, on peut aussi la faire heriter de Mur et surcharger la fonction dessin), elle ne sera pas ronde mais rectangulaire (seulement comme on va la dessiner ronde, l'illusion se fera). La balle est en mouvement, elle aura deux paramètres v_x et v_y (déplacement verticale et horizontale). Pour les rebonds, on fait le choix suivant, si on deplace la balle de v_x et si elle touche un objet alors v_x change de signe, on fait la même chose pour v_y. (Les rebonds sont donc moins bien géré que l'an dernier mais en réalité on ne voit pas la différence).

Exercices
  1. Compléter les méthodes suivantes :

La fin

Il ne reste plus qu'a tout initialiser et lancer la boucle de jeu.


				
Remarque

Vous remarquez que le programme sépare les colisions entre les instances de Mur, Brique et Palet, en réalité on peut faire mieux mais celà demande une notion hors programme (le polymorphiqme).

Améliorations possibles
Exercices
  1. Il peut être pénible de générer les différentes briques à la main, alors pourquoi ne pas optimiser ?
    Faire une Classe Map qui prendra un tableau deux dimensions, et une longueur et une largeur en entrée et qui aura pour but de placer les élèments du jeu. Par exemple le casse brique de la page à été généré à l'aide de cette matrice :
    [[1,1,1,1,1,1,1,1,1,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,3,3,3,3,3,3,0,1],
    [1,0,2,2,2,2,2,2,0,1],
    [1,0,2,2,2,2,2,2,0,1],
    [1,0,2,2,2,2,2,2,0,1],
    [1,0,2,2,2,2,2,2,0,1],
    [1,0,2,2,2,2,2,2,0,1],
    [1,0,3,3,3,3,3,3,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1],
    [1,0,0,0,0,0,0,0,0,1]]

    1 représente un mur, puis 2 les briques à une vie, 3 la brique à 2 vies ect..., les palets et les balles ne sont pas générés mais on peut bien sur le faire.

Changement de repère

Comme vous le savez le repère d'EZ à les ordonnées orientées vers le bas et l'origine est sur le coin haut et gauche. Nous utiliserons cependant un autre repère (repère de la carte).

Pour passer des coordonnées du repère de la carte aux coordonnées à utiliser dans EZ, il faut utiliser les fonctions suivantes :


				
Remarque

Bien sur vous pouvez rester uniquement dans le repère d'EZ (et d'ailleurs vous gagnez un peu en calcul) mais alors si votre fenêtre "bouge" alors en réalité c'est le décor qui bouge, de plus si votre personnage saute alors il descend en ordonnée. Bien sur ce n'est pas insurmontable.

Versions élèves

Une version améliorée du casse brique, allant plus loin dans la programmation orientée objet (plus de classe, utilisation de pygame à la place de EZ) faite par M. Picouleau Mathéo en 2021.

Telecharger