Toucher la raquette
Leçon 32 sur 41 du cours Créer 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.
Défi
MoyenFais rebondir la balle sur les raquettes.
- Après le rebond contre le mur, lorsque la balle entre en collision avec
left, définisvx = abs(vx). - Lorsqu’elle entre en collision avec
right, définisvx = -abs(vx).
Appuie sur « Jouer » et renvoie la balle avec la raquette droite : elle rebondit. Puis clique sur « Vérifier ».
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()
Toutes les leçons de Créer des jeux avec Pygame
1La boucle de jeu
Ouvrir une fenêtreRemplir l’arrière-plan4Deux joueurs et une balle
La balleRebondEntraînez-vous par vous-même : Playground Pygame