Connexion élèves

Choisir le(s) module(s) à installer :

Mini-Projets en POO

Vous avez terminé le TP "Champagne !" ?. Très bien ! Vous savez maintenant ( presque ) tout sur la POO...

Vous avez encore du temps ? Ok, voici deux autres projets possibles...

La fontaine colorée

Des balles colorées jaillissent du bas de la fenêtre avec une vitesse plus ou moins grande, décrivent ensuite une trajectoire parabolique avant de retomber au sol.

Sans entrer dans les explications, la grosse différence est que la composante verticale de la vitesse vy doit évoluer au cours du temps, selon l'équation : vy = vy + 10*dt, où dt représente la durée entre deux positions successives d'une balle.

On peut prendre dt égale à la durée entre deux frames de la boucle d'animation; cette valeur est par défaut de 60 ms ( 60e-3 s ).
N'hésitez pas cependant à modifier ce paramètre pour rendre l'animation plus fluide.

La composante horizontale vx ne change elle jamais ( pour les personnes concernées, vous verrez en SPC pourquoi, et aussi d'où sort le "10"...).

Compléter le code ci-dessous pour réaliser cette animation :

import p5 from random import randint class Balle: def __init__(self, x, y, couleur, taille, vx, vy): self.x = x self.y = y self.couleur = couleur # indice de la couleur dans la liste 'couleurs' self.taille = taille self.vx = vx # vitesse horizontale initiale ( vers la gauche ou la droite ) self.vy = vy # vitesse verticale initiale ( vers le haut ! ) def affiche(self): couleurs = ['white', 'red', 'green', 'blue', 'cyan', 'yellow', 'magenta'] p5.fill(couleurs[self.couleur]) p5.ellipse(self.x - self.taille//2, self.y - self.taille//2, taille//2, taille//2) def move(self): pass def setup(): p5.createCanvas(600, 400) def draw(): p5.background(0) pass # instanciation des balles # Quelques valeurs "qui vont bien" : # position initiale en bas au milieu de la fenêtre, soit x = 300 et y = 400 # taille entre 2 et 10 pixels # vx entre -5 et 5 # vy entre -30 et -10 pass p5.run(setup, draw)

SOLUTION

Rebonds

Et un p'tit dernier pour la route : les classiques balles rebondissantes. Adaptez le code précédent pour créer cette animation :

Compléter le script ci-dessous pour réaliser cette animation.

import p5 from random import randint class Balle: def __init__(self, x, y, couleur, taille, vx, vy): self.x = x self.y = y self.couleur = couleur # indice de la couleur dans la liste 'couleurs' self.taille = taille self.vx = vx # vitesse horizontale initiale ( vers la gauche ou la droite ) self.vy = vy # vitesse verticale initiale ( vers le haut ! ) def affiche(self): couleurs = ['white', 'red', 'green', 'blue', 'cyan', 'yellow', 'magenta'] p5.fill(couleurs[self.couleur]) p5.ellipse(self.x - self.taille//2, self.y - self.taille//2, taille//2, taille//2) def move(self): pass def testRebond(self): pass def setup(): p5.createCanvas(600, 400) def draw(): p5.background(0) pass # instanciation des balles # Quelques valeurs "qui vont bien" : # Position initiale x = 0 et y = 0 # taille entre 2 et 20 # vx entre 5 et 50 # vy entre 0 et 20 pass run(setup, draw)

Quelques conseils pour la gestion des rebonds

Un premier conseil : confiez la gestion des rebonds à une autre méthode ( testRebond() par exemple... ) de la classe Balle, méthode que vous appellerez à la suite des deux autres dans la boucle d'animation anim().
Cette méthode gérera aussi le cas où il faut réinitialiser les attributs de la balle ( lorsqu'elle sort sur les côtés de l'écran ).

Un rebond doit être déclenché au moment où une balle atteint le bas de la fenêtre; à ce moment les balles se déplaçant horizontalement de manière uniforme, c'est donc uniquement la valeur de vy qu'il faudra réinitialiser ( vx elle ne change pas...).
Cette modification devra "inverser" le sens de déplacement, mais aussi tenir compte de l'amortissement; pour cela, vous pouvez simplement multiplier à ce moment la valeur de la vitesse verticale vy de la balle lors de son "impact" au "sol" par un coefficient inférieur à 1 ( plus ce coefficient sera petit, plus le rebond sera "mou".).

SOLUTION