Постепенно быстрее
Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 32 из 32.
По мере прохождения игры она становится сложнее. Здесь блоки каждые 10 секунд падают немного быстрее.
pygame.time.set_timer(event_type, ms) отправляет событие указанного типа каждые ms миллисекунд. Создай собственный тип события с помощью pygame.USEREVENT — это число, которое pygame оставляет для тебя свободным:
SPEED_UP = pygame.USEREVENT + 1
pygame.time.set_timer(SPEED_UP, 10000)
fall_speed = 3
for event in pygame.event.get():
if event.type == SPEED_UP:
fall_speed += 1Это событие появляется в цикле обработки событий вместе с остальными раз в 10 секунд. Затем блок падает с помощью block.y += fall_speed, а не с фиксированной скоростью 3. Новая игра снова начинается медленно, поэтому при перезапуске также устанавливается fall_speed = 3.
Задание
Средне- Ниже шрифта задайте
SPEED_UP = pygame.USEREVENT + 1и запустите для него таймер с интервалом 10000 мс. - Перед циклом задайте
fall_speed = 3и используйте эту переменную для падения. - Увеличивайте
fall_speedна 1 при получении события SPEED_UP. - Сбрасывайте значение на 3, когда клавиша R запускает новую игру.
Попробуйте сами
import random
import pygame
pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Catch the Blocks")
clock = pygame.time.Clock()
font = pygame.font.Font(None, 32)
basket = pygame.Rect(200, 330, 80, 16)
block = pygame.Rect(220, 0, 20, 20)
score = 0
lives = 3
paused = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_p:
paused = not paused
elif event.key == pygame.K_r and (lives == 0 or score == 10):
score = 0
lives = 3
basket.x = 200
block.y = -20
block.x = random.randint(0, 460)
if lives > 0 and score < 10 and not paused:
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
basket.x -= 8
if keys[pygame.K_RIGHT]:
basket.x += 8
basket.clamp_ip(screen.get_rect())
block.y += 3
if block.top > 360:
block.y = -20
block.x = random.randint(0, 460)
lives -= 1
if block.colliderect(basket):
block.y = -20
block.x = random.randint(0, 460)
score += 1
screen.fill((30, 30, 46))
pygame.draw.rect(screen, (80, 160, 255), basket)
pygame.draw.rect(screen, (235, 80, 80), block)
score_text = font.render(f"Score: {score}", True, (240, 240, 240))
screen.blit(score_text, (10, 10))
lives_text = font.render(f"Lives: {lives}", True, (240, 240, 240))
screen.blit(lives_text, (370, 10))
if lives == 0:
message = font.render("Game over", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
elif score == 10:
message = font.render("You win!", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
if lives == 0 or score == 10:
again = font.render("Press R to play again", True, (240, 240, 240))
screen.blit(again, again.get_rect(center=(240, 200)))
if paused:
message = font.render("Paused", True, (240, 240, 240))
screen.blit(message, message.get_rect(center=(240, 160)))
pygame.display.flip()
clock.tick(60)
pygame.quit()
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Игровой цикл
Потренируйтесь самостоятельно: Песочница Pygame