Jason. Cała informatyka w jednym miejscu!

Kontynuujemy dalej programowanie w Pythonie! Zajmiemy się teraz zagadnieniem związanym z rysowaniem obrazów importowanych z pliku zewnętrznego takich formatów jak JPEG, BMP czy PNG. Czym byłyby gry bez grafiki (z szacunkiem do gier konsolowych) ;)? Przejdziemy przez wszystkie etapy, bo wczytywanie pliku graficznego wymaga troszkę trudniejszych posunięć. Traktujcie to jako kolejną część wpisu na temat rysowania figur w "pygame". Zapraszam do środeczka :)!

WCZYTYWANIE PLIKU TO JUŻ INNY MODUŁ

Możecie pomyśleć "aha! Też moduł "draw", racja?". Pudło. Gdyby to dotyczyło tego samego modułu, nie rozdzielałbym tego na dwa osobne artykuły. Procedura prawidłowego wyświetlenia importowanego obrazu składa się z kilku etapów i metod, które nie znajdują się w jednym module.

IMPORT OBRAZU

Wszystko po kolei. Potrzebny będzie inny moduł, "pygame.image", ale tylko w kontekście załadowania obrazu o podanej lokalizacji. Tylko samo wczytywanie pliku. Tak wygląda poprawne wywołanie:

image = pygame.image.load([ścieżka względna do pliku jako łańcuch znaków])

Metoda zwraca referencję do naszego obrazka, więc nie zapomnijcie sobie zdefiniować zmiennej do tego celu.

CZYSZCZENIE EKRANU

Wczytywanie pliku już mamy za sobą. Następnie, już w środku pętli "while", musicie zadbać o czyszczenie ekranu z zawartości zarejestrowanych w poprzedniej klatce gry. Najprostszym sposobem jest skorzystanie z metody "pygame" o nazwie "fill" którą wywołujecie z poziomu zmiennej przechowującej okno gry. Prosi tylko o jedno: listę trzech wartości palety barw RGB. W ten sposób decydujecie o kolorze jakim ma zostać zamalowany ekran:

[okno].fill([r, g, b])

Zabezpieczyliśmy się przed niechcianymi artefaktami, które polegają na "rozjeżdżaniu" wszystkich obrazów z powodu braku sprzątania po sobie. Ciężko to sobie wyobrazić? Zerknijcie na poniższy obrazek i zobaczcie jak by to wyglądało, gdybyśmy tego nie zrobili.

Animacja obrazu bez czyszczenia klatki w "pygame" w Pythonie

Brak "posprzątania" po poprzedniej klatce powoduje "rozjechanie" wszystkich elementów graficznych, które są w ruchu.

NANOSZENIE OBRAZU

Przechodzimy teraz do metody okna gry "pygame" o nazwie "blit". Najprościej pisząc, to pozwoli na rysowanie obrazu na płótnie, którym jest między innymi nasze okno gry. To tak, jakbyście wywołali metodę rysującą podany przez Was obrazek tylko "ulepszoną" o możliwość wybrania na jakie płótno ten obraz nanieść. Metoda oprócz zmiennej "obrazkowej" potrzebuje jeszcze listy z dwiema liczbami całkowitymi jako współrzędne w przestrzeni dwuwymiarowej:

[okno].blit([obraz], [x, y])

Możecie bez przeszkód wstawić dwukrotnie ten sam obrazek. Po prostu wywołujecie tę samą metodę drugi raz pod spodem dając tylko inne współrzędne, aby faktycznie było widać oba obrazki.

ODŚWIEŻANIE EKRANU

Mamy wczytywanie pliku graficznego oraz nanoszenie go na okno gry. Została ostatnia rzecz. Umieszczamy na samym końcu wywołanie jednej z metod odpowiedzialnych za odświeżanie ekranu: "update" oraz "flip" są do Waszej dyspozycji, przy czym korzystacie tylko z jednej albo z drugiej, broń Boże z dwóch naraz! Wspominałem o nich w artykule dotyczącym rysowania figur prostych:

pygame.display.update()
pygame.display.flip()

PRZYKŁADOWY KOD ŹRÓDŁOWY

To już wszystko :D! Przedstawiam złożony w całość przykładowy kod źródłowy celem rozwiania jakichkolwiek dylematów. Wystarczy zaopatrzyć się w dowolny obrazek i ewentualnie zmienić rozszerzenie z PNG na jakieś inne:

import pygame

is_running = True
window = pygame.display.set_mode([256, 256])
image = pygame.image.load("image.png")

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

    window.fill([0, 0, 0])
    window.blit(image, [0, 0])
    window.blit(image, [72, 16])
    pygame.display.update()

pygame.quit()

A tak wygląda efekt końcowy:

Wczytywanie plików graficznych w "pygame" w Pythonie

Prawidłowe rysowanie grafiki w "pygame" polega na przykryciu lub wyczyszczeniu całej poprzedniej klatki, naniesieniu obrazków na podane płótno (w tym przypadku na okno gry) oraz odświeżenie wprowadzonych zmian przy użyciu metody "update" lub "flip".

W ten sposób przeszliśmy wczytywanie pliku, przygotowanie ekranu pod rysowanie obrazków oraz ujrzenie efektu.


Z mojej strony to wszystko w tym temacie. Gdyby ktoś się pytał czemu rozgrzebuję na drobne atomy taką prostą rzecz, to tylko dlatego iż uważam, że sztuką nie jest programować żeby działało, tylko sztuką jest pisać czysty i efektywny kod, i co najważniejsze, pisać w sposób świadomy. Wiedzieć co to robi, dlaczego się to pisze oraz dlaczego w tym miejscu, a nie wcześniej czy później.

PODOBNE ARTYKUŁY