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.
Desafio
Médio- Adicione
SPAWN = pygame.USEREVENT + 1,speed = 6e uma listaobstacle_imagescomspike_ball.pngeblob.png. - Escreva o sprite
Obstaclecomo mostrado. - Crie um grupo chamado
obstaclese inicie o temporizadorSPAWNem 1500 ms. - Quando ocorrer
SPAWN, adicione um obstáculo e reinicie o temporizador comrandom.randint(1000, 2000). - 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()
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