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