Menu
CoddyTech

Tirs en angle

Leçon 36 sur 41 du cours Créer des jeux avec Pygame de Coddy.

Dans Pong, l’endroit où la balle frappe la raquette détermine sa direction. Près du haut, elle part vers le haut ; près du bas, vers le bas ; et au milieu, tout droit.

Mesure la distance entre le milieu de la balle et celui de la raquette, et utilise cette valeur comme nouveau vy :

if ball.colliderect(right):
    vx = -abs(vx)
    vy = (ball.centery - right.centery) // 6

Au-dessus du milieu, la différence est négative, donc la balle part vers le haut ; en dessous, elle est positive. La division par 6 évite que la balle aille trop vite : un impact tout au bout donne un vy d’environ 7.

Ainsi, Pong devient un jeu d’adresse : tu vises avec ta raquette.

challenge icon

Défi

Difficile

Fais en sorte que les raquettes dirigent la balle.

  1. Dans les deux collisions avec une raquette, après avoir défini vx, définis vy comme la différence entre le centre de la balle et le centre de cette raquette.
  2. Divise cette différence par 6 avec //.

Appuie sur « Jouer » et frappe la balle avec l’extrémité d’une raquette : elle part en biais. Puis appuie 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()
font = pygame.font.Font(None, 36)

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)
left_score = 0
right_score = 0
waiting = False

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            waiting = 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())

    if not waiting:
        ball.x += vx
        ball.y += vy
        if ball.top <= 0 or ball.bottom >= 400:
            vy = -vy
        if ball.colliderect(left):
            vx = abs(vx)
        if ball.colliderect(right):
            vx = -abs(vx)
        if ball.left > 600:
            left_score += 1
            ball.center = (300, 200)
            vx = -vx
            waiting = True
        if ball.right < 0:
            right_score += 1
            ball.center = (300, 200)
            vx = -vx
            waiting = True

    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)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    if waiting:
        message = font.render("Press Space to serve", True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 360)))
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

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

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