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 :
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 :
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.
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