Menu
CoddyTech

Obstacles

Fait partie de la section Règles du jeu du Journey Pygame de Coddy. Leçon 26 sur 29.

Maintenant, ajoutons quelque chose à sauter. Un obstacle est un sprite qui apparaît un peu après le bord droit, au sol, et se déplace vers la gauche :

class Obstacle(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = random.choice(obstacle_images)
        self.rect = self.image.get_rect(midbottom=(664, GROUND_Y))

    def update(self):
        self.rect.x -= speed
        if self.rect.right < 0:
            self.kill()

obstacle_images contient la boule à pointes et la masse gélatineuse, chargées une seule fois, afin que chaque obstacle choisisse une image sans lire de fichier. kill() retire un sprite de tous les groupes auxquels il appartient, ainsi les obstacles qui sortent par la gauche sont oubliés.

Garde-les dans un groupe : obstacles.update() les déplace tous et obstacles.draw(screen) les dessine tous. Un minuteur les ajoute. Chaque fois qu’il se déclenche, relance-le avec un intervalle aléatoire, afin que le joueur ne puisse pas sauter à un rythme régulier :

if event.type == SPAWN:
    obstacles.add(Obstacle())
    pygame.time.set_timer(SPAWN, random.randint(1000, 2000))

Le coureur ne peut pas encore les toucher. Nous verrons cela ensuite.

challenge icon

Défi

Moyen
  1. Ajoute SPAWN = pygame.USEREVENT + 1, speed = 6 et une liste obstacle_images avec spike_ball.png et blob.png.
  2. Écris le sprite Obstacle comme indiqué.
  3. Crée un groupe nommé obstacles et démarre le minuteur SPAWN à 1500 ms.
  4. À SPAWN, ajoute un obstacle et redémarre le minuteur avec random.randint(1000, 2000).
  5. Mets à jour et dessine le groupe à chaque image.

Essayez vous-même

import pygame

pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()

SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1


class Runner(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.frames = [
            pygame.image.load("assets/images/player.png").convert_alpha(),
            pygame.image.load("assets/images/player_walk.png").convert_alpha(),
        ]
        self.image = self.frames[0]
        self.step = 0
        self.rect = self.image.get_rect(midbottom=(100, GROUND_Y))
        self.vy = 0

    def jump(self):
        if self.rect.bottom == GROUND_Y:
            self.vy = -16

    def update(self):
        self.vy += GRAVITY
        self.rect.y += self.vy
        if self.rect.bottom >= GROUND_Y:
            self.rect.bottom = GROUND_Y
            self.vy = 0
        if self.rect.bottom == GROUND_Y:
            self.step += 1
            self.image = self.frames[self.step // 8 % 2]
        else:
            self.image = self.frames[1]


runner = Runner()

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.KEYDOWN and event.key in (pygame.K_SPACE, pygame.K_UP):
            runner.jump()

    runner.update()

    screen.fill(SKY)
    pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
    screen.blit(runner.image, runner.rect)
    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 Règles du jeu

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