Menu
CoddyTech

Frapper la raquette

Leçon 32 sur 40 du cours Créez des jeux avec Pygame de Coddy.

Lorsque la balle touche une raquette, elle doit repartir dans l’autre sens. ball.colliderect(right) indique si elles se touchent.

Inverser le signe, vx = -vx, présente un piège. Si la balle est encore à l’intérieur de la raquette à la frame suivante (elle a touché le bord de la raquette ou la raquette s’est déplacée sur elle), le signe s’inverse encore et encore : la balle tremble à l’intérieur de la raquette.

Définis plutôt la direction au lieu de l’inverser. abs(vx) est vx sans son signe, donc toujours positif :

if ball.colliderect(left):
    vx = abs(vx)
if ball.colliderect(right):
    vx = -abs(vx)

Après avoir touché la raquette de gauche, la balle part toujours vers la droite, et après avoir touché celle de droite, toujours vers la gauche, quel que soit le nombre de frames pendant lesquelles elles restent en contact.

challenge icon

Défi

Moyen

Après le rebond sur le mur, lorsque la balle entre en collision avec left, définissez vx = abs(vx) ; lorsqu’elle entre en collision avec right, définissez vx = -abs(vx).

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((600, 400))
pygame.display.set_caption("Pong")
clock = pygame.time.Clock()

ball = pygame.Rect(293, 193, 14, 14)
vx, vy = 5, 4
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        left.y -= 6
    if keys[pygame.K_s]:
        left.y += 6
    if keys[pygame.K_UP]:
        right.y -= 6
    if keys[pygame.K_DOWN]:
        right.y += 6
    left.clamp_ip(screen.get_rect())
    right.clamp_ip(screen.get_rect())

    ball.x += vx
    ball.y += vy
    if ball.top <= 0 or ball.bottom >= 400:
        vy = -vy

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    pygame.draw.rect(screen, (255, 196, 0), ball)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Créez des jeux avec Pygame

Entraînez-vous par vous-même : Playground Pygame