Menu
CoddyTech

Постепенно быстрее

Часть раздела Игровой цикл путешествия по 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.

challenge icon

Задание

Средне
  1. Ниже шрифта задайте SPEED_UP = pygame.USEREVENT + 1 и запустите для него таймер с интервалом 10000 мс.
  2. Перед циклом задайте fall_speed = 3 и используйте эту переменную для падения.
  3. Увеличивайте fall_speed на 1 при получении события SPEED_UP.
  4. Сбрасывайте значение на 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()
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Игровой цикл

Потренируйтесь самостоятельно: Песочница Pygame