Gra w Pythonie – PyGame – Hello World- #1
Korzystając z wolnego dnia, stwierdziłam, że spróbuję czegoś nowego i zabiorę się za napisanie prostej gry. Już od jakiegoś czasu chodzi za mną taki mały projekcik – rekonstrukcja Dino Game z Chrome’a w różnych językach programowania. Jako że chcę poćwiczyć jeszcze trochę Pythona przed zmierzeniem się z projektem licencjackim (dobra wymówka:P), zdecydowałam się zacząć właśnie od niego. I biblioteki PyGame.
Instalacja PyGame
Na początek potrzebny będzie oczywiście Python. Polecam wersję 3.5 – działa dobrze pod Windowsem i nie sprawia żadnych problemów. Tutorial, w którym opisałam jak najprościej go zainstalować, znajdziecie pod tym linkiem.
Pamiętaj, aby zaznaczyć pole z pip, bo zaraz się przyda :)
Po instalacji, upewnij się, że Python został zainstalowany poprawnie (np. poleceniem python --version ) i uruchom komendę pip install pygame:
I tak tak naprawdę tyle.
Hello World?
Pisząc program w czystym Pythonie, naszym jedynym wejściem i wyjściem jest konsola. PyGame daje nam do dyspozycji GUI – stworzona z jego pomocą aplikacja powinna otwierać się w ładnym graficznym okienku.
Napiszmy więc nasze pierwsze Hello World.
Utwórz nowy plik – mój nazywa się game.py. Umieść w nim kod:
1 2 3 4 5 6 |
import pygame, sys from pygame.locals import * pygame.init() DISPLAY_SURFACE = pygame.display.set_mode((500, 500)) pygame.display.set_caption('Hello World!') |
Teraz chwila przerwy – co ten kod robi?
Pierwsza linijka importuje nam moduły, z których funkcje będziemy wykorzystywać tak naprawdę w każdej stworzonej z PyGame grze. Drugi wers pozwoli nam korzystać ze zmiennych umieszczonych w pygame.locals bez używania pygame.locals.function(), tylko samego function(). Oczywiście nie jest to rzecz niezbędna, ale na pewno sprawi, że kod będzie czytelniejszy.
pygame.init() inicjalizuje PyGame’owe funkcje – jest potrzebna i już :).
Kolejna zmienna, DISPLAY_SURFACE, przechowuje obiekt pygame.Surface, wywołany przez pygame.display.set_mode. Jak łatwo się domyślić, krotka w nawiasie przekazuje wymiar okna, które otworzy się po wywołaniu programu, a ostatni wers pozwala określić jego tytuł. Warto tutaj zwrócić uwagę właśnie na fakt, że jest to krotka, a nie dwa integery – tylko w ten sposób będzie działać.
Uruchom aplikację poleceniem python game.py. Co się dzieje? Okno otwiera się, lecz od razu zamyka (prawie jak pierwsze programy w Pascalu, gdy nie wiedziało się, że trzeba dopisać readln’ea na końcu;)).
Aby okno działało, dopóki nie zamkniemy go X, będziemy potrzebować jeszcze kilku linijek kodu:
1 2 3 4 5 6 |
while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() pygame.display.update() |
Wystarczy rzut oka na ten skrypt, żeby zauważyć, że jest to pętla, która wczytuje wszystkie “dziejące się” eventy i gdy natrafi na typ równy QUIT (albo pygame.locals.QUIT, jeśli zapomnieliśmy o drugim imporcie), dezaktywuje PyGame i kończy działanie programu.
Oczywiście typy eventów mogą być bardzo różne: kliknięcie myszą, naciśnięcie klawisza itp. Tutaj rozpatrujemy absolutnie najprostszy przypadek – w końcu to Hello World.
Ostatnia, tajemnicza linijka pygame.display.update() rysuje naszą planszę na nowo, z uwzględnieniem ewentualnych zmian stanów. U nas nic się nie dzieje, więc cały czas będzie wyświetlać jedynie czarne okienko.
Czas na uruchomienie:
Twoja pierwsza gra będzie wyglądać właśnie tak :). Pięknie, prawda?
Uzupełnijmy puste okno
Dopracujmy nasze Hello World jeszcze trochę – tak, aby gra coś wyświetlała. Posłużymy się tak zwanymi drawing primitives (rysowanymi prymitywami?), czyli prostymi kształtami, których położenie zdefiniujemy co do piksela. Dosłownie :).
Najpierw zdefiniujemy sobie kilka kolorów, z których będziemy korzystać:
1 2 3 4 |
BLACK = (0, 0, 0) WHITE = (255, 255, 255) GREEN = (129, 187, 129) GRAY = (225, 225, 225) |
A następnie utworzymy kilka kształtów:
1 2 3 4 5 |
DISPLAY_SURFACE.fill(GRAY) pygame.draw.line(DISPLAY_SURFACE, BLACK, (60, 60), (120, 60), 4) pygame.draw.line(DISPLAY_SURFACE, WHITE, (60, 70), (120, 70), 4) pygame.draw.circle(DISPLAY_SURFACE, WHITE, (300, 50), 20, 0) pygame.draw.rect(DISPLAY_SURFACE, GREEN, (200, 150, 100, 50)) |
Na początek wypełniamy całe okno kolorem szarym. Później tworzymy dwie linie – wybieramy kolor, współrzędne punktu rozpoczęcia rysowania linii, współrzędne punktu zakończenia i jej grubość. Kolejne powstaje koło, ze środkiem o współrzędnych (300,50) i o promieniu 20. Ostatnia zmienna pozwala zdefiniować, czy będzie ono wypełnione (gdy jest 0), lub czy będzie okręgiem o konkretnej grubości. Na koniec opisujemy jeszcze zielony prostokąt z czterema zmiennymi: XY lewego górnego rogu, szerokością i wysokością.
Wygląda to tak:
O rysowaniu kształtów można więcej poczytać w dokumentacji.
Na koniec dodajmy jeszcze piękny napis “Hello World” na środku planszy:
1 2 3 4 |
myfont = pygame.font.SysFont("monospace", 30) label = myfont.render("Hello World!", 1, BLACK) DISPLAY_SURFACE.blit(label, (100, 100)) |
I podziwiajmy jak się prezentuje :).