Menu
CoddyTech

Une classe Ball

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

La balle est un Rect auquel s’ajoutent deux nombres et les tâches qu’elle accomplit : se déplacer, rebondir, être dessinée. Fais-en une classe, comme tu l’as fait pour tes sprites : une classe regroupe les données et les fonctions qui les utilisent.

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

ball = Ball() crée un objet balle et exécute __init__. Dans la classe, self désigne l’objet, donc self.vx est le vx propre à cette balle. Les fonctions d’une classe sont des méthodes : ball.move() en appelle une.

À l’extérieur de la classe, le Rect de la balle est maintenant ball.rect et sa vitesse est ball.vx et ball.vy ; le code de la raquette et du score les lit donc à cet endroit. Le jeu se déroule comme avant.

challenge icon

Défi

Difficile

Fais de la balle une classe qui se déplace et se dessine elle-même.

  1. En haut, écris class Ball avec __init__ (self.rect, self.vx = 5, self.vy = 4), move() (déplace la balle et la fait rebondir sur les bords supérieur et inférieur) et draw(surface).
  2. Crée ball = Ball(), puis appelle ball.move() et ball.draw(screen) dans la boucle.
  3. Partout ailleurs, écris ball.rect, ball.vx et ball.vy.

Appuie sur « Jouer » : le jeu se déroule exactement comme avant. 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()
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
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.x += vx
        ball.y += vy
        if ball.top <= 0 or ball.bottom >= 400:
            vy = -vy
        if ball.colliderect(left):
            vx = abs(vx)
            vy = (ball.centery - left.centery) // 6
        if ball.colliderect(right):
            vx = -abs(vx)
            vy = (ball.centery - right.centery) // 6
        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
        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)
    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 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()

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

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