Menu
CoddyTech

Obstáculos

Parte da seção Regras do jogo do Journey de Pygame da Coddy. Lição 26 de 29.

Agora, algo para pular. Um obstáculo é um sprite que começa um pouco além da borda direita, no chão, e se move para a esquerda:

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 contém a bola com espinhos e o blob, carregados uma vez, então cada obstáculo escolhe uma imagem sem ler um arquivo. kill() remove um sprite de todos os grupos dos quais ele faz parte, então os obstáculos que saem pela esquerda são esquecidos.

Mantenha-os em um grupo: obstacles.update() move todos eles e obstacles.draw(screen) desenha todos eles. Um temporizador os adiciona. Cada vez que ele dispara, reinicie-o com um intervalo aleatório, para que o jogador não possa pular seguindo um ritmo:

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

O corredor ainda não pode colidir com eles. Isso vem a seguir.

challenge icon

Desafio

Médio
  1. Adicione SPAWN = pygame.USEREVENT + 1, speed = 6 e uma lista obstacle_images com spike_ball.png e blob.png.
  2. Escreva o sprite Obstacle como mostrado.
  3. Crie um grupo chamado obstacles e inicie o temporizador SPAWN em 1500 ms.
  4. Quando ocorrer SPAWN, adicione um obstáculo e reinicie o temporizador com random.randint(1000, 2000).
  5. Atualize e desenhe o grupo a cada quadro.

Experimente você mesmo

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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Regras do jogo

Pratique por conta própria: Playground de Pygame