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.
Desafío
Intermedio- Añade
SPAWN = pygame.USEREVENT + 1,speed = 6y una listaobstacle_imagesconspike_ball.pngyblob.png. - Escribe el sprite
Obstaclecomo se muestra. - Crea un grupo llamado
obstaclese inicia el temporizadorSPAWNen 1500 ms. - Cuando se active
SPAWN, añade un obstáculo y reinicia el temporizador conrandom.randint(1000, 2000). - 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()
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Reglas del juego
3Temporizadores y oleadas
A salvo tras un golpeUn evento de temporizadorUna roca cada 800 msOleadas que crecenCuenta atrás para empezar6Corredor del cielo
El corredorSaltarPractica por tu cuenta: Playground de Pygame