Um Menu para Corredor do Céu
Parte da seção Regras do jogo do Journey de Pygame da Coddy. Lição 29 de 30.
Sky Runner obtém as regras desta seção, começando com um menu. Um novo jogo precisa voltar ao estado inicial, então coloque isso em reset(): um novo corredor, um grupo vazio, a velocidade e a pontuação, e os dois cronômetros iniciados novamente.
A barra de espaço agora faz duas coisas, uma para cada estado:
if state == "play":
runner.jump()
elif state == "menu":
reset()
state = "play"O menu precisa de duas linhas centralizadas, e a tela de fim de jogo precisará de três, então uma pequena função desenha uma linha centralizada em x 320:
def show(text, text_font, y):
picture = text_font.render(text, True, INK)
screen.blit(picture, picture.get_rect(center=(320, y)))A pontuação pertence a um jogo, então mostre-a somente depois que o jogo tiver começado, e não no menu.
Desafio
MédioAdicione um menu a Sky Runner.
- Escreva
reset()para o corredor, o grupo,speed,scoree os dois temporizadores; chame essa função antes do loop e definastate = "menu". - No menu, use
show()paraSky Runnerembig_fonte paraPress Space to start; mostre a pontuação apenas fora do menu. - Ao pressionar Espaço no menu, chame
reset()e definastate = "play".
Pressione “Jogar”: a tecla Espaço inicia uma partida. Depois, clique em “Verificar”.
Experimente você mesmo
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 320))
pygame.display.set_caption("Sky Runner")
clock = pygame.time.Clock()
font = pygame.font.Font("assets/fonts/pixel.ttf", 32)
SKY = (140, 200, 240)
GROUND = (90, 160, 80)
GROUND_Y = 260
GRAVITY = 1
SPAWN = pygame.USEREVENT + 1
POINT = pygame.USEREVENT + 2
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]
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 = [
pygame.image.load("assets/images/spike_ball.png").convert_alpha(),
pygame.image.load("assets/images/blob.png").convert_alpha(),
]
runner = Runner()
obstacles = pygame.sprite.Group()
speed = 6
pygame.time.set_timer(SPAWN, 1500)
pygame.time.set_timer(POINT, 100)
score = 0
state = "play"
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):
if state == "play":
runner.jump()
if event.type == SPAWN and state == "play":
obstacles.add(Obstacle())
pygame.time.set_timer(SPAWN, random.randint(1000, 2000))
if event.type == POINT and state == "play":
score += 1
if state == "play":
speed = min(14, 6 + score // 100)
runner.update()
obstacles.update()
if pygame.sprite.spritecollideany(runner, obstacles, pygame.sprite.collide_mask):
state = "over"
screen.fill(SKY)
pygame.draw.rect(screen, GROUND, (0, GROUND_Y, 640, 60))
screen.blit(runner.image, runner.rect)
obstacles.draw(screen)
score_text = font.render(f"{score:05}", True, (40, 50, 80))
screen.blit(score_text, score_text.get_rect(topright=(630, 10)))
if state == "over":
message = font.render("Game over", True, (40, 50, 80))
screen.blit(message, message.get_rect(center=(320, 140)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
Todas as lições de Regras do jogo
3Temporizadores e ondas
Seguro após um impactoUm evento de temporizadorUma rocha a cada 800 msOndas que crescemContagem regressiva para começar6Corredor do Céu
O CorredorPularPratique por conta própria: Playground de Pygame