Pygame Zero - Balles rebondissantes 1
Pygame zero est une version simplifiée de la bibliothèque Pygame qui sert à créer des jeux en python.
Créez un dossier balles_rebondissantes
et ouvrez le avec Codium, puis copiez dans un fichier balles.py
:
import pgzrun
from pgzero.builtins import screen
WIDTH = 640
HEIGHT = 480
COULEUR_BALLE = (255,0,0)
COULEUR_FOND = (0,0,0)
x = 300
y = 200
dx = 4
dy = -3
def draw():
screen.clear()
screen.fill(COULEUR_FOND)
screen.draw.filled_circle((x,y),10,COULEUR_BALLE)
def update():
global x,y
x += dx
y += dy
pgzrun.go()
Exécutez le code pour observer le résultat (vous pouvez l'arrêter avec Ctrl+C dans le terminal de Codium)
- La bibliothèque est utilisable grâce au
import pgzrun
en haut, et le jeu est lancé avecpgzrun.go()
à la fin du fichier; - La bibliothèque appelle alors à intervalles réguliers:
update()
pour mettre à jour les données du jeudraw()
pour redessiner l'écran
- Les variables créées à l'extérieur d'une fonction ne peuvent pas être ré-assignées dedans. On peut quand même le faire en les déclarant avec
global
au début de la fonction, ce qu'on a fait dans la fonctionupdate
.
Rebonds
Faites rebondir la balle lorsqu'elle touche les bords de l'écran.
- Faites cela dans la fonction
update
- Un rebond sur un des murs revient à inverser la vitesse verticale ou horizontale (dy ou dx) selon le mur
- Réfléchissez au test à faire pour un des murs, et à l'action à prendre. Puis répétez pour les 3 autres murs
2 balles
Ajoutez une deuxième balle, avec une vitesse et une position de départ (voire une couleur et une taille) différente.
30 balles
Mettez 30 balles en tout. Vous allez devoir changer de stratégie car créer 30 variables à la main pour chaque paramètre serait très pénible. Utilisez des listes.
Générez les positions de départ et les vitesses au hasard
avec la fonction randint(min, max)
du module random
.
Améliorations
-
Utilisez le rayon des balles pour avoir le rebond pile quand le bord de la balle touche le bord de l'écran.
-
Si vous avez le temps, essayez de gérer les collisions entre les balles (commencez avec deux balles, et faites un dessin pour comprendre ce qu'il se passe).
Collisions
- Version simplifiée : si on échange juste les vitesses des deux balles au moment de la collision, cela donne un résultat acceptable.
-
Version réaliste, en utilisant cette formule pour la collision élastique :
Dans cette formule, les positions x1 et vitesses v1 sont des vecteurs à 2 coordonnées, qu'on peut représenter par des tuples. Pour calculer ces vitesses, il sera utile de créer des fonctions intermédiaires :
# Pour calculer x1 - x2 sur des vecteurs def sub(x1 : tuple, x2 : tuple) -> tuple # Pour calculer la norme au carré: x[0]**2 + x[1]**2 def norme2(x : tuple) -> float # Pour calculer le produit scalaire: x1[0]*x2[0] + x1[1]*x2[1] def dot(x1 : tuple, x2 : tuple) -> float # Pour multiplier un vecteur par une constante def prod(c : float, x : tuple) -> tuple