Menu
CoddyTech

Obstáculos

Parte de la sección Reglas del juego del Journey de Pygame de Coddy. Lección 26 de 29.

Ahora algo que saltar. Un obstáculo es un sprite que empieza un poco más allá del borde derecho, en el suelo, y se mueve hacia la izquierda:

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 contiene la bola con pinchos y la masa, cargadas una sola vez, así que cada obstáculo elige una imagen sin leer un archivo. kill() quita un sprite de todos los grupos a los que pertenece, así que los obstáculos que salen por la izquierda se eliminan.

Guárdalos en un grupo: obstacles.update() los mueve a todos y obstacles.draw(screen) los dibuja a todos. Un temporizador los añade. Cada vez que se activa, vuelve a iniciarlo con un intervalo aleatorio, para que el jugador no pueda saltar siguiendo un ritmo:

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

El corredor todavía no puede chocar con ellos. Eso viene a continuación.

challenge icon

Desafío

Intermedio
  1. Añade SPAWN = pygame.USEREVENT + 1, speed = 6 y una lista obstacle_images con spike_ball.png y blob.png.
  2. Escribe el sprite Obstacle como se muestra.
  3. Crea un grupo llamado obstacles e inicia el temporizador SPAWN en 1500 ms.
  4. Cuando se active SPAWN, añade un obstáculo y reinicia el temporizador con random.randint(1000, 2000).
  5. Actualiza y dibuja el grupo en cada fotograma.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Reglas del juego

Practica por tu cuenta: Playground de Pygame