Rozdział 20 · Tworzenie gier z Pygame

Mini-projekt: odbijająca się piłka

Pierwsza prawdziwa mini-gra na Pygame – ruch, odbicia i pętla rozgrywki w jednym krótkim projekcie.

Wszystko to połącz w jeden mini-projekt: piłkę, która odbija się od wszystkich czterech ścian ekranu.

prygayushij_myach.py
import pygame

SHIRINA, VYSOTA = 600, 400
RADIUS = 20

pygame.init()
screen = pygame.display.set_mode((SHIRINA, VYSOTA))
clock = pygame.time.Clock()

x, y = SHIRINA // 2, VYSOTA // 2
dx, dy = 4, 3

rabotaet = True
while rabotaet:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            rabotaet = False

    x += dx
    y += dy

    if x - RADIUS < 0 or x + RADIUS > SHIRINA:
        dx = -dx
    if y - RADIUS < 0 or y + RADIUS > VYSOTA:
        dy = -dy

    screen.fill((20, 20, 40))
    pygame.draw.circle(screen, (255, 100, 100), (int(x), int(y)), RADIUS)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()
Trzy prawdziwe okna obok siebie: czerwona kula w różnych miejscach na ciemnoniebieskim polu
Realne okno: Ta sama piłka z projects/pygame/bouncing-ball/bouncing_ball_basic.py na trzech kolejnych pozycjach trajektorii.
dx = -dx — odbicie w jednej linii
Zmiana znaku prędkości na przeciwny — standardowy sposób odbicia od ściany: ruch trwa z tą samą prędkością, tylko w przeciwnym kierunku, bez dodatkowych kontroli kierunku.

Kompletny, już zeskanowany plik – osobno:

projects/pygame/bouncing-ball/bouncing_ball_basic.py

★★ Zadanie samodzielne
Zmieniamy kolor przy odbiciu

Za każdym razem, gdy odbijesz się od ściany, wybierz nowy losowy kolor kuli (random.choice() z rozdziałów 5/11).

Challenge
Dwie Kule

Dodaj drugą piłkę własnym x, y, dx dy – obie powinny się poruszać i odbijać niezależnie.

Praktyka: odbijająca się piłka
Pygame otwiera natywne okno Python – uruchomione lokalnie w VS Code, PyCharm lub Jupyter
Praktyka kursuje lokalnie
Otwórz praktykę →
Ograniczenia tej wersji
Piłka już się odbija, ale ta wersja ma słabości: prędkość odbicia zależy od liczby klatek na daną komputer, a cały kod leży w zmiennych globalnych bez żadnej struktury. Później w tym rozdziale przyjrzymy się, skąd biorą się oba ograniczenia i jak rozwinąć ten sam projekt w profesjonalnie zorganizowaną wersję z klasą Game, z pauzą i ruchem, który nie zależy od liczby klatek.