Menu
CoddyTech
flag Ru iconРусскийdown icon

Ускорение со временем

Урок 18 из 40 курса Создавай игры на Pygame на Coddy.

По мере продолжения игры она становится сложнее. Здесь блоки каждые 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

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