Les rebonds d'une balle avec Pygame
La balle que nous allons utiliser est une image au format gif:

Et voici un premier code qui la fait rebondir sur les bords:
| Python |
|---|
| import sys, pygame
pygame.init()
size = width, height = 640, 480
speed = [2, 2]
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT: sys.exit()
ballrect = ballrect.move(speed)
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0 or ballrect.bottom > height:
speed[1] = -speed[1]
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
|
C'est donc assez simple, la fonction move() permet de déplacer l'image.
La collision de la balle sur les bords (ballrect.left < 0 or ballrect.right > width) ou sur le haut ou le bas inverse une des coordonnées de la vitesse ce qui permet de simuler le rebond.
c'est ce code que nous allons adapter pour simuler des rebonds sur le sol en prenant en compte la gravité.
Lancer de la balle avec gravité
Dans le code à compléter, nous voulons :
-
que la balle soit lancée vers le haut lors d'un appui sur la barre d'espace, et lorsque la balle est au sol.
-
quand la balle n'est pas au sol, la gravité joue et la vitesse verticale est augmenté d'une certaine constante.
-
lorsque la balle arrive au niveau du sol, si sa vitesse est suffisament grande, elle rebondit, sinon la vitesse verticale devient nulle.
ALors, complète le code suivant :
| Python |
|---|
| import sys, pygame
pygame.init()
size = width, height = 640, 480
speed = [1, 0] # la balle a une vitesse initiale vers la droite
black = 0, 0, 0
screen = pygame.display.set_mode(size)
ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()
ballrect.bottom = height # permet de placer la balle au sol au début du jeu
# boucle principale
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# gestion des touches pressées
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if ballrect.bottom > 0.85 * ...: # la balle est dans la partie basse de l'écran
speed[1] = -5 # une valeur négative correspond à une vitesse vers le haut ! en raison du système de coordonnée aui augment vers le bas...
ballrect = ballrect.move(speed) # pour déplacer la balle
# rebond sur les bords haut, gauche et droit
if ballrect.left < 0 or ballrect.right > width:
speed[0] = -speed[0]
if ballrect.top < 0:
speed[1] = -speed[1]
# quand la balle arrive au sol
if ballrect.bottom > height:
if abs(speed[1]) > 1: # vitesse grande
speed[1] = ... # a compléter en diminuant la vitesse
else:
speed[1] = ... # la vitesse verticale devient nulle
# gestion de la gravité
if ballrect.bottom < ...: # cas oĂą la balle est en l'air
speed[1] += ... # la bonne valeur qui donne une impression de gravité n'est pas simple à trouver
# gestion de l'affichage
screen.fill(black)
screen.blit(ball, ballrect)
pygame.display.flip()
|
code complet