Menu
CoddyTech

Toucher et réinitialiser avec des méthodes

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

Deux autres tâches incombent à la balle : rebondir sur une raquette et retourner au milieu. Sous forme de méthodes, la boucle principale se lit comme les règles du jeu.

def reset(self):
    self.rect.center = (300, 200)
    self.vx = -self.vx

Les deux tests de collision avec les raquettes ne diffèrent que par la direction dans laquelle la balle repart : vers la droite après avoir touché la raquette de gauche, vers la gauche après avoir touché celle de droite. Passe cette direction sous forme de nombre, way, 1 ou -1, et une seule méthode suffit pour les deux :

ball.hit(left, 1)
ball.hit(right, -1)

À l’intérieur, self.vx = way * abs(self.vx) envoie la balle dans cette direction, quel que soit son mouvement précédent, et l’angle du tir reste le même.

challenge icon

Défi

Difficile

Déplace la détection des collisions avec les raquettes et la réinitialisation dans la classe Ball.

  1. Écris hit(paddle, way) : en cas de collision, self.vx = way * abs(self.vx) et l’angle du tir.
  2. Écris reset() : centre en (300, 200) et inverse self.vx.
  3. Dans la boucle, appelle ball.hit(left, 1), ball.hit(right, -1) et ball.reset() après chaque point.

Appuie sur « Jouer » : le jeu se déroule toujours de la même façon. Puis clique sur « Vérifier ».

Essayez vous-même

import pygame


class Ball:
    def __init__(self):
        self.rect = pygame.Rect(293, 193, 14, 14)
        self.vx = 5
        self.vy = 4

    def move(self):
        self.rect.x += self.vx
        self.rect.y += self.vy
        if self.rect.top <= 0 or self.rect.bottom >= 400:
            self.vy = -self.vy

    def draw(self, surface):
        pygame.draw.rect(surface, (255, 196, 0), self.rect)


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 = Ball()
left = pygame.Rect(20, 160, 12, 80)
right = pygame.Rect(568, 160, 12, 80)
left_score = 0
right_score = 0
waiting = False
winner = None

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:
            if winner is None:
                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.move()
        if ball.rect.colliderect(left):
            ball.vx = abs(ball.vx)
            ball.vy = (ball.rect.centery - left.centery) // 6
        if ball.rect.colliderect(right):
            ball.vx = -abs(ball.vx)
            ball.vy = (ball.rect.centery - right.centery) // 6
        if ball.rect.left > 600:
            left_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if ball.rect.right < 0:
            right_score += 1
            ball.rect.center = (300, 200)
            ball.vx = -ball.vx
            waiting = True
        if left_score == 5:
            winner = "Left player wins!"
        elif right_score == 5:
            winner = "Right player wins!"

    screen.fill((30, 30, 46))
    pygame.draw.rect(screen, (80, 160, 255), left)
    pygame.draw.rect(screen, (235, 80, 80), right)
    ball.draw(screen)
    score = font.render(f"{left_score} : {right_score}", True, (240, 240, 240))
    screen.blit(score, score.get_rect(center=(300, 30)))
    if winner is not None:
        message = font.render(winner, True, (240, 240, 240))
        screen.blit(message, message.get_rect(center=(300, 120)))
    elif 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()
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éer des jeux avec Pygame

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