TD2 : Pong

L’objectif de cet TD est d’étudier et de modéliser des rebonds simples contre les bords du jeu. Nous étudierons le jeu Pong qui fut un dès tout premier jeu disponible sous console.

Le jeu Pong sur Console ATARI

Mise en place

Téléchargez le source du projet Pong.

Ouvrez et lancez ce programme. Vous devriez voir ceci :

../_images/demo.gif

La raquette peut être déplacée avec les touches flèches Haut et Bas. Le rebond sur le bord haut est programmé ainsi que la détection de collision sur la raquette. Le rebond sur le bord bas est inexistant. La balle disparaît à jamais !

Notions clefs

Rebond sur le haut de l’écran

Dans l’exercice précédent, le palet rebondissait contre les bords de l’écran lorsque son centre touchait les bords. Cela était peu réaliste car on ne tenait pas du tout compte de la l’épaisseur du palet. Nous expliquons ci-dessous comment gérer cette question :

../_images/rebond.png

Avertissement

Contrairement au repère cartésien habituel, le centre du repère (0,0) se trouve en haut à gauche. L’axe des X est orienté de la même manière, mais l’axe des Y lui est orienté vers le bas. Ainsi, un pixel se trouvant en haut de l’écran a une ordonnée égale à 0.

La variable correspondant au rayon de la boule s’appelle ball_radius. La collision en haut de l’écran est détectée lorsque la composante en y de la balle : ball_y devient inférieure à ball_radius. Ainsi lorsque ball_y < ball_radius, on détecte que la balle est « virtuellement » rentrée dans le mur . Dans ce cas, on inverse le signe la composante en y de la vitesse de la balle : vit_y. Nous pouvons aussi corriger la position de la balle qui n’aurait jamais dû rentrer dans le mur en réinitialisant ball_y à la valeur ball_radius, cette correction n’est pas totalement exacte, mais pour l’instant, cela suffira.

Rebond contre la raquette de gauche

La logique reste la même que précédemment. Cependant, la configuration est un peu plus complexe. Il faut prendre en compte à la fois : la distance entre la raquette et le mur, l’épaisseur de la raquette et le rayon de la boule. Une fois que la composante en x de la balle est inférieure à cette grandeur, on sait qu’une collision s’est produite. Pour effectuer un rebond sur un bord vertical, il suffit d’inverser le signe de la composante en x de la vitesse de la balle, ainsi elle repart dans l’autre sens. Pour éviter toute forme de bug, on réinitialise la position x de la balle à la position de contact idéal entre la raquette et la balle.

../_images/raquette.png

Afficher du texte

Contrairement aux autres fonctions de dessin, l’écriture de texte se fait en trois étapes. D’abord il faut choisir la police utilisée, ainsi que sa taille, c’est le rôle de la ligne suivante :

police = pygame.font.SysFont("arial", 15)

Ensuite, on dessine le texte à afficher dans une zone à part, il ne s’agit pas de l’écran mais d’une zone tampon dans laquelle le texte est dessiné. Cette zone est créée pour contenir le texte demandé :

zone = police.render( str(score_player1)+" : " + str(score_player2), True, GREEN)

En dernière étape, on affiche la zone de texte sur l’écran de jeu grâce à la fonction BitBlt :

screen.blit(zone,(300,10))

To-do List

  • Positionnez les deux raquettes à mi-hauteur dès le début du jeu

  • Faîtes en sorte que les deux palets ne sortent ni par le bas, ni par le haut de l’écran

  • Gérez le rebond de la balle contre le bas de l’écran

  • Utilisez les touches du clavier A et Q pour faire bouger le 2ème palet de haut en bas

  • Gérez la collision de la balle ainsi que son rebond sur le palet de droite

    • Inspirez-vous du code du palet de gauche déjà fourni

  • Gérez la sortie du palet : lorsque le palet n’est plus visible à l’écran, un des joueurs gagne 1 point

    • Réinitialisez la vitesse de la balle ainsi que sa position au centre de l’écran

  • Lorsqu’un joueur obtient trois points, affichez indéfiniment « JOUEUR 1 GAGNANT »

    • En grosses lettres jaunes, au centre de l’écran sur fond rouge

  • Une fois la partie terminée, on ne gère pas le redémarrage