Projekt w postaci gry napisanej w Python to świetny pomysł, aby podnieść swoje umiejętności programistyczne jak również usystematyzować zdobytą już wiedzę. Zanim zacznie się jednak tworzyć swoją pierwszą grę warto poznać bibliotekę która umożliwi stworzenie jej. Biblioteką tą jest PYGAME

Spis treści

Co to jest Pygame

Pygame – to stworzona przez Pete Shinnersa biblioteka przeznaczona do tworzenia gier komputerowych oraz aplikacji multimedialnych w języku Python. Pygame daje nam do dyspozycji GUI ( Graficzny interfejs użytkownika, interfejs graficzny, środowisko graficzne, GUI (ang. graphical user interface)) który umożliwia na wyświetlanie grafiki, odtwarzanie dźwięków, śledzenie czasu, obsługę myszy i joysticka, obsługę CD, czy renderowanie czcionek TTF.

Instalacja

Instalacja jest prosta i wymaga jedynie wywołania komendy do instalacji w pythonie.

pip install pygame

Tworzenie okna gry

Podstawą każdej gry jest okienko w którym będzie się wszystko działo, aby utworzyć takie okno gry w pygame musimy najpierw zaimportować bibliotekę pygame. Następnie wykorzystać pygame.init() która służy do zainicjowania zaimportowanych modułów gry z naszej biblioteki. Wreszcie definiujemy nasze okno gry o wymiarach 500 x 500 dzięki pygame.display.set_mode((500, 500)) i na koniec wyświetlamy je za pomocą pygame.display.set_caption(„Moja Gra”) gdzie w nawiasie możemy ustawić nazwę naszego okienka, w tym wypadku nazwaliśmy go „Moja gra”.

import pygame

pygame.init()
# definiowanie okna gry
win = pygame.display.set_mode((500, 500))
# wyświetlenie okna gry
pygame.display.set_caption("Moja Gra")

po uruchomieniu programu, zobaczymy o to takie okno gry.

Jednak okno wyświetla nam się tylko na chwile. Naprawimy to używając tak zwanej pętli głównej gry która będzie „podtrzymywać” nasze okno

run = True
# pętla główna
while run:
    # obsługa zdarzeń  
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

Pętla while spowoduję, że nasze okno nie zamyka się, ale jednak chcemy, by się zamknęło kiedy my tego chcemy.Najlepiej, żeby zamykało się wtedy kiedy klikniemy na X w prawym górnym rogu. Użyjemy do tego celu obsługe zdarzeń. Dzięki pętli for event in pygame.event.get() odczytujemy kolejkę wszystkich zdarzeń z klawiatury lub myszy wysyłanych między aplikacją pygame a użytkownikiem. Ustawiając warunek if event.type == pygame.QUIT: sprawdzamy czy zdarzenie event.type równa się QUIT czyli naciśniecie na X w oknie. Jeśli warunek zostanie spełniony to pętla główna przestanie działać i okno się zamknie.

Cały kod

import pygame

pygame.init()
# definiowanie okna gry
win = pygame.display.set_mode((500, 500))
# wyświetlanie okna gry
pygame.display.set_caption("Moja Gra")

run = True
# pętla główna
while run:
    # obsługa zdarzeń 
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

 

Tworzenie rysunków

Tworząc gry musimy tworzyć różne obiekty jak również teksty informujące o ilości zdobywanych pkt lub opisujący menu, dlatego biblioteka pygame, oferuje prosty sposób tworzenia różnych figur oraz umożliwia wypisywanie tekstu w oknie.

Aby narysować prostokąt definiujemy jego kolor, wymiary oraz położenie w którym chcemy go narysować. Następnie w pętli umieścimy metodę pygame.draw.rect() która narysuje prostokąt w oknie, jednak nie zobaczymy go po uruchomieniu programu dopóki na końcu nie dodamy pygame.display.update() która odpowiada za odświeżenie ekranu naszego okna.

#definiujemy zmienne
KOLOR = (255, 0, 0)
x = 10
y = 30
szer = 100
wys = 100
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    # funkcja rysująca kwadrat
    pygame.draw.rect(win, KOLOR, (x, y, szer, wys))
    # odświeżenie ekranu 
    pygame.display.update()

Wynikiem tego kodu będzie :

Biblioteka umożliwia nie tylko rysowanie prostokąta, ale również koła

pygame.draw.circle(win, (128, 0, 128), (60, 200), 50, 0)

gdzie pygame.draw.circle(okno, Kolor, Współrzędne, Średnica, Wypełnienie)

oraz linii

# linia pozioma
pygame.draw.line(win, NIEBIESKI, (10, 325), (110, 325), 15)
# linia pionowa
pygame.draw.line(win, SZARY, (210, 275), (210, 375), 5)

pygame.draw.line(Okno, kolor, współrzędne_początkowe, współrzędne_końcowe , grubość_lini) gdzie linia jest rysowana poprzez połączenie dwóch punktów, współrzędne_początkowe z współrzędne_końcowe.

Kiedy chcemy dodać teks na przykład jako menu startowe w grze, albo wyświetlanie wyniku jaki otrzymaliśmy. Potrzebujemy jedynie 3 linijki kodu

font = pygame.font.SysFont('comicsans', 30)
label = font.render('Ale ze mnie Pablo Picasso ', 1, (255, 255, 255))
win.blit(label, (100, 425))

Gdzie musimy najpierw zdefiniować czcionkę oraz rozmiar teksu pygame.font.SysFont(‚comicsans’, 30), następnie definiujemy tekst i jego kolor jaki chcemy wypisać font.render(‚Ale ze mnie Pablo Picasso’ , 1, (255, 255, 255)), a na koniec wypisujemy teks win.blit(label, (100, 425)) w lokalizacji zdeklarowanej w nawiasie.

Kilka przykładów

import pygame

pygame.init()
win = pygame.display.set_mode((500, 500))
pygame.display.set_caption("First Game")

# deklarowanie kolorów
CZERWONY = (255, 0, 0)
ZIELONY = (0, 255, 0)
ZOLTY = (255, 255, 0)
FIOLETOWY = (128, 0, 128)
JASNY_NIEBIESKI = (0, 255, 255)
POMARANCZOWY = (255, 165, 0)
NIEBIESKI = (0, 0, 255)
SZARY = (128, 128, 128)

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

    # rysowanie kwadratów
    pygame.draw.rect(win, CZERWONY , (10, 30, 100, 100))
    pygame.draw.rect(win, ZOLTY, (160, 30, 100, 100))
    pygame.draw.rect(win, ZIELONY, (310, 30, 100, 100))
    # rysowanie kół
    pygame.draw.circle(win, FIOLETOWY, (60, 200), 50, 0)
    pygame.draw.circle(win, JASNY_NIEBIESKI, (210, 200), 50, 25)
    pygame.draw.circle(win, POMARANCZOWY, (360, 200), 50, 5)
    # linia pozioma
    pygame.draw.line(win, NIEBIESKI, (10, 325), (110, 325), 15)
    # linia pionowa
    pygame.draw.line(win, SZARY, (210, 275), (210, 375), 5)
    # rysowanie plusa
    pygame.draw.line(win, NIEBIESKI, (310, 325), (410, 325), 10)
    pygame.draw.line(win, SZARY, (360, 275), (360, 375), 10)
    # wypisywanie tekstu
    font = pygame.font.SysFont('comicsans', 30)
    label = font.render('Ale ze mnie Pablo Picasso ', 1, (255, 255, 255))
    win.blit(label, (100, 425))

    pygame.display.update()

 

Poruszanie postacią w grze

Kluczowe w każdej grze jest poruszanie postacią, bez tego ciężko mówić o tworzeniu gry. Polegać to będzie na obsługiwaniu zdarzeń poprzez metode pygame.key.get_pressed() która będzie pobierać stan wszystkich przycisków. Zależnie od wciśniętego przycisku, do zmiennej x lub y (odpowiadające za położenie obiektu) zostanie dodana lub odjęta zmienna krok, wyniku czego nasz obiekt przesunie się o daną wartość wybranym przez nas kierunku.

    # opóźnienie w grze
    pygame.time.delay(50)
    # obsługa zdarzeń 
    keys = pygame.key.get_pressed()
    # warunki do zmiany pozycji obiektu
    if keys[pygame.K_LEFT] :
        x -= krok
    if keys[pygame.K_RIGHT] :
        x += krok
    if keys[pygame.K_UP] :
        y -= krok
    if keys[pygame.K_DOWN] :
        y += krok

    pygame.draw.rect(okno, (0, 255, 0), (x, y, szerokosc, wysokosc))
    pygame.display.update()

Stworzone przez nas warunki powodują, że w zależności od wciśniętego przycisku czy to strzałka w dół (keys[pygame.K_DOWN]), czy w prawo (keys[pygame.K_RIGHT]) zostają wprowadzone nowe współrzędne naszego obiektu( zielony kwadrat). Posiadamy również możliwość zarządzania płynność gry dzięki funkcje pygame.time.delay(50) która odpowiada za opóźnienie gry o milisekundy, w naszym przypadku to 0,05 sek.

Teraz kiedy odpalimy program i zaczniemy poruszać obiektem, naszym oczom ukaże się coś tego typu

Spowodowane jest to tym, że poprzednie pozycja kwadratu zostaję wciąż na ekranie, żeby to naprawić przed narysowaniem obiektu w nowej pozycji musimy wyczyścić ekran

Wykorzystamy do tego funkcje fill(), która zamaluje cały ekran wybranym przez nas kolorem (mamy czarne tło więc będziemy używać czarnego koloru) przed narysowaniem naszego obiektu.

win.fill((0, 0, 0))
pygame.draw.rect(okno, (0, 255, 0), (x, y, szerokosc, wysokosc))
pygame.display.update()

Wyniku otrzymamy

Cały kod

import pygame

pygame.init()

win = pygame.display.set_mode((500, 540))
pygame.display.set_caption("Pierwsza gra")

x = 0
y = 40
szerokosc = 20
wysokosc = 20
krok = 20
run = True

while run:
    # opóźnienie w grze
    pygame.time.delay(50)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    # obsługa zdarzeń 
    keys = pygame.key.get_pressed()
    # warunki do zmiany pozycji obiektu
    if keys[pygame.K_LEFT]:
        x -= krok
    if keys[pygame.K_RIGHT]:
        x += krok
    if keys[pygame.K_UP]:
        y -= krok
    if keys[pygame.K_DOWN] :
        y += krok

    # "czyszczenie" ekranu
    win.fill((0, 0, 0))
    # rysowanie prostokąta
    pygame.draw.rect(win, (0, 255, 0), (x, y, szerokosc, wysokosc))
    # odświeżenie ekranu 
    pygame.display.update()

 

Dodawanie zdjęć

Nasza gra, żeby mogła się charakteryzować nietuzinkowymi postaciami którymi możemy grać, oraz zachwycającymi tłami powinna mieć też możliwość wgrywania rożnych grafik, a nie jedynie opierać się na rysowaniu figur na jednokolorowym tle.

Dlatego pygame umożliwia nam szybkie wgrywanie obrazów

 

# dodanie postaci
postac = pygame.image.load('Rakieta.png')
# dodanie tła
tlo = pygame.image.load('Tło.jpg')

do tego służy metoda pygame.image.load(nazwa_pliku)

następnie żeby to wyświetlić wystarczy użyć metody blit(), w taki sposób

win.blit(tlo,(0, 0 ))
win.blit(postac, (x,y))

Po uruchomieniu zamiast poruszaniem kwadratu w czarnej odchłani mamy do dyspozycji rakietę w kosmosie

Cały kod

import pygame

pygame.init()
win = pygame.display.set_mode((390,395))
pygame.display.set_caption("First Game")
# Dodawanie postaci
postac = pygame.image.load('Rakieta.png')
# dodawanie tła
tlo = pygame.image.load('Tło.jpg')

x = 150
y = 200
run = True

while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    # Inicjalizacja tła
    win.blit(tlo,(0, 0 ))
    # Inicjalizacja postaci
    win.blit(postac, (x,y))
    pygame.display.update()

Podsumowanie

Za pomocą pygame możemy zrobić wiele rzeczy, stworzyć okno gry, rysować różne obiekty i nimi sterować i na dodatek wgrywać zdjęcia. Posiadając te podstawy można wykorzystać potencjał tej biblioteki i stworzyć pierwsze gry pokroju sneka, pac mana lub tetrisa. Dlatego w kolejnych artykułach zajmiemy się tworzeniem takich właśnie o to gier.