Gotowy(-a) na kolejną porcję wiedzy z biblioteki "pygame" 😄? Teraz pokażę jak wygląda obsługa tekstu w "pygame" 🔔. Programowanie tekstu jest już dużo prostsze niż to, co było z obrazkiem. Słowo 😉!

OBSŁUGA TEKSTU W "PYGAME" KROK PO KROKU

Zdecydowana większość operacji dotyczących tekstu, odbędzie się poprzez moduł "pygame.font". Zakładam, że już wiesz czym jest moduł w Pythonie oraz jak go importować na dwa sposoby (jak nie, to migiem do załączonego artykułu 😁).

Po raz kolejny podzielimy sobie całą czynność na poszczególne etapy.

1. INICJALIZACJA

Wstępem do wyświetlania tekstu w grze, jest zainicjowanie niezbędnych funkcjonalności używając metody "init" z modułu "pygame.font" 👇:

pygame.font.init()

To jest metoda niezwracająca żadnej wartości, a zatem po prostu ją wywołujemy zaraz po utworzeniu sobie okna z grą, linijkę niżej:

window = pygame.display.set_mode([256, 256])

pygame.font.init()

Niczego innego w tym kroku nie trzeba robić ✅.

2. IMPORT CZCIONKI

Teraz możemy zabrać się za pobranie jednej ze czcionek zainstalowanych w systemie 💾. Mamy taką metodę jak, "SysFont" (również z modułu "pygame.font"). Wywołujemy ją podstawiając zwracaną wartość do zmiennej ℹ️.

Metoda przyjmuje 2 parametry:

  • łańcuch znaków jako nazwa "rodziny" czcionek zainstalowana w systemie operacyjnym,
  • liczba całkowita jako rozmiar czcionki.

Parę zdań wyjaśnienia pierwszego parametru. Pisząc "rodzina", mam na myśli "bazową" nazwę czcionki jaka się znajduje na Twoim komputerze 💻. Pobierając czcionki, często natrafisz na komplet składający się z wersji standardowej, ale też pogrubionej (ang. bold) i w kursywie (ang. italic).

Nazwałem to "rodziną", gdyż są takie narzędzia, w których konieczne jest dopisanie słówka w przypadku chęci zastosowania czcionki pogrubionej lub w postaci kursywy. Wówczas dopisuje się "bold" (w przypadku pogrubienia) lub "italic" (w przypadku kursywy). W "pygame" nie trzeba tak robić ℹ️. Obsługa tekstu w "pygame" wymaga tylko nazwy "rodziny" czcionki i już 👍.

Tak wygląda przykład 👇:

font = pygame.font.SysFont("Comic Sans MS", 24)

3. TWORZENIE ZMIENNEJ DLA TEKSTU

Punkt nr 3, to zdefiniowanie zmiennej, która przechowa render naszego tekstu. W "pygame" najpierw "wypala się" tekst, a potem dopiero wyświetlamy go na ekranie. W zmiennej przechowującej czcionkę, korzystamy z metody "render". Wymaga wstawienia 3 parametrów:

  • łańcuch znaków jako łańcuch, który ma się wyświetlić (może to być dowolny ciąg i może mieć znaki diakrytyczne, takie jak 'ś', 'ć' czy 'ł'),
  • wartość logiczna do ustawiania wygładzania krawędzi (ang. antialiasing) łańcuchowi jaki będzie wyświetlany,
  • lista trzech liczb całkowitych zgodnych z formatem palety barw RGB (od 0 do 255).

Przykład użycia 👇:

text = font.render("Mój łańcuch znaków", True, [128, 64, 255])

Jeżeli nie planujemy zmieniać tekstu w trakcie działania gry, najlepiej wstawić tę instrukcję poza pętlę "while" (szczegóły zostawiłem w sekcji dotyczącej edycji tekstu 🫵).

4. WYŚWIETLANIE TEKSTU

Pamiętasz metodę "blit" podczas rysowania obrazów 🙂? Z tekstem robimy dokładnie tak samo 👇:

window.blit(tekst, [16, 16])

W tej metodzie, nie ma znaczenia czy wstawiamy obraz, czy tekst ℹ️.

Przypomnę jeszcze, że zaraz po tym, należy obowiązkowo wstawić wywołanie metody odświeżającej ekran ⚠️! "pygame" nie robi tego samoistnie, więc musisz o to sam(a) zadbać! Korzystasz albo z "update", albo z "flip":

window.blit(tekst, [16, 16])
pygame.display.update()    # lub "pygame.display.flip()"

Brak tej metody spowoduje, że nie zobaczysz żadnego tekstu, nawet po wstawieniu wywołania "blit" ⛔!

Prawidłowe wykonanie wszystkich kroków, przyniesie nam taki efekt:

Rysowanie tekstu przy użyciu metody "blit" w "pygame"

Efekt użycia metody "blit" w "pygame" rysującej utworzony tekst.

Podsumowując 📝:

  1. inicjuj używając metody "pygame.font.init",
  2. importuj czcionkę stosując metodę "pygame.font.SysFont",
  3. utwórz tekst wywołując metodę "render" ze zmiennej przechowującej czcionkę,
  4. wyświetl tekst używając metody "blit" wywoływanej z okna gry,
  5. aktualizuj stan wywołując metodę "update" lub "flip" z modułu "pygame.display".

Tak brzmi cała "receptura" na wyświetlanie tekstu w "pygame" 🧨! Na tym się kończy podstawowa część, jednak jeżeli interesuje Cię manipulacja już utworzonym tekstem, to zapraszam do dalszej lektury 📖!

EDYCJA TEKSTU

W tej części pokażę Ci 3 rzeczy, które mogą Ci się przydać 👇:

  • jak zmienić tekst na inny w momencie, gdy już został utworzony,
  • jak nałożyć pogrubienie,
  • jak wyśrodkować tekst.
ZMIANA ŁAŃCUCHA ZNAKÓW

W "pygame" jest taki mankament, że pewne podstawowe operacje na tekstach wymagają niekonwencjonalnych posunięć. To jest jedna z nich. Nie ma żadnej metody ustawiającej nowy łańcuch już istniejącemu 🤯. Żeby móc "edytować" już powstały łańcuch...musimy go stworzyć na nowo!

W pętli "while", tam gdzie zachodzi potrzeba aktualizacji, po prostu piszesz tę samą instrukcję 👇:

text = font.render("Mój łańcuch znaków", True, [128, 64, 255])

Zrób wszystko, żeby skrypt nie wykonywał tego polecenia klatka po klatce - to może mocno odbić się na płynności 💣!!! Wywołuj to tylko wtedy, gdy jest to konieczne np. gdy gracz zebrał monetę (pod wpływem zdarzenia, zamiast co interwał czasowy) 💰.

POGRUBIENIE I KURSYWA

Kolejna rzecz, która wymaga mniej intuicyjnego podejścia. Możesz sobie pomyśleć, że jest jakaś właściwość w zmiennej przechowującej tekst, dzięki której przełączysz tekst na pogrubiony albo na kursywę. W "pygame" faktycznie jest taka możliwość, lecz nie z poziomu tekstu, tylko czcionki 😱.

Tworząc zmienną dla czcionki, dodajesz kolejny parametr 👇:

font = pygame.font.SysFont("Comic Sans MS", 24, bold=True)

Zapis jest inny niż standardowy, gdyż jest to parametr opcjonalny ℹ️. W Pythonie jest możliwość "przeskoczenia" pewnych parametrów i wpisania tylko tych, które są Ci potrzebne, unikając wstawiania jakichś śmieciowych wartości tylko po to, żeby się przedostać do konkretnego parametru ✅.

W każdym razie, gdy chcesz mieć pogrubiony albo pochyły tekst, z poziomu czcionki dodajesz parametr "bold" lub "italic" i ustawiasz na "True", gdyż to jest wartość logiczna.

Domyślając się co może Ci chodzić po głowie, to odpowiadam: tak, jeżeli chcesz mieć część tekstów pisanych normalnie, część pogrubionych, a część pochyłych, to niestety - 3 osobne instancje czcionki z różnym zestawem parametrów 😐.

W przypadku czcionki pochyłej, piszesz "italic" i ustawiasz na "True" 👇:

font = pygame.font.SysFont("Comic Sans MS", 24, italic=True)

Gdy czcionka ma być pogrubiona ORAZ pochyła, to przełączasz oba:

font = pygame.font.SysFont("Comic Sans MS", 24, bold=True, italic=True)
WYŚRODKOWANIE TEKSTU

I po raz trzeci "pygame" pokazuje, że nie ma prostej drogi do uzyskania jednej z podstawowych rzeczy 🙄. Żeby wyśrodkować tekst, musisz do metody "blit" przekazać kolejny parametr w postaci prostokąta ("pygame.Rect"), a on z kolei musi pochodzić z wywołania metody "get_rect" wraz z przekazaniem argumentu opcjonalnego 🤯.

Oto co musisz zrobić - podaną pozycję tekstu 👇:

window.blit(tekst, [16, 16])

zamień na to:

window.blit(tekst, text.get_rect(centerx=GAME_WIDTH // 2))

gdzie "GAME_WIDTH" oznacza szerokość ekranu gry (możesz sobie dopisać taką stałą na początku kodu 👍). Parametr "centerx" odpowiada za ustawianie środka prostokąta w osi X. To sprawi, że pozycja zostanie przesunięta względem ustawionego środka, a na wyjściu otrzymamy wyśrodkowany tekst w osi X:

Rysowanie wyśrodkowanego tekstu przy użyciu metody "blit" w "pygame"

Efekt użycia metody "blit" w "pygame" rysującej utworzony tekst wyśrodkowany w osi X.

Zdaję sobie sprawę, że ta część może przypominać "antyreklamę" sugerującą dlaczego możesz nie chcieć brać "pygame" pod uwagę w tworzeniu gier, jako że nie oferuje prostych sposobów na konfigurację tekstu, bo faktem jest że obsługa tekstu w "pygame" potrafi dać do pieca ❌. Coś, co powinno skończyć się na prostym ustawianiu parametrów w tekście, wymaga jakichś "fikołków", do których można łatwo stracić cierpliwość 💥. Stąd dorzuciłem od siebie sposoby na manipulowanie tekstem.


Wszystko w tym temacie 💪.

PODOBNE ARTYKUŁY