Generator pikselowych krajobrazów z PyGame.
W repozytorium github umieściłem kod projektu napisanego w pythonie z użyciem pygame, który jest prostą zabawką nad którą spędziłem kilka godzin programując z dziećmi i pokazując jakie wyzwania napotykamy pracując nad grami komputerowymi. Narzędzie to generuje prosty krajobraz w stylu gier retro:
Założenia projektu
- Generuje elementy krajobrazu używając technik programistycznych
- Opiera się na losowości
- Zawiera przynajmniej jeden ruchomy element (chmury)
Wzory obiektów
Wszystkie elementy widoczne na obrazku są generowane na podstawie wzorów zapisanych w kodzie wraz z informacją o kolorach danego wzoru. Dla przykładu drzewo zapisane jest następująco:
class Tree(WorldObject): pattern = [ [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,0,0,0,0,0,0], [0,0,0,0,2,2,2,0,0,0], [0,0,0,2,2,2,2,2,0,0], [0,0,0,2,2,2,2,2,0,0], [0,0,0,2,2,2,2,2,0,0], [0,0,0,0,2,1,2,0,0,0], [0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0,0], ] colors = {} def __init__(self, size: float = 1.0, shade: float = 1.0): self.size = size self.shade = shade self.colors = { 1: (self.shade * 200, self.shade * 119, 0), 2: (0, self.shade * 180, 0) }
Jak widać wzór (pattern) jest statyczną tablicą dwuwymiarową, natomiast kolory są zależne od parametru „odcień” (shade).
Każdy typ obiektu świata aplikacji jest zapisany w osobnej klasie dziedziczącej po klasie WorldObject. Zajrzyj do katalogu src/world_objects aby zobaczyć implementacje gór, chmur i drzew. Możesz również zajrzeć do src/display.py aby zobaczyć w jaki sposób elementy są umieszczane na ekranie.
Wczytywanie plików graficznych
Dodatkowo aplikacja umożliwia wczytywanie obiektów z plików graficznych, aby to zrobić wystarczy w klasie objektu dodać:
self.image = pygame.image.load('./images/tree.png')
Jeśli pole „image” nie jest puste, zostanie ono użyte zamiast wzoru z pola pattern.
W domyślnej formie aplikacja nie używa żadnych obrazków, wszystkie obiekty są generowane z wzorów.
GUI
Aplikacja posiada proste GUI składające się z trzech przycisków. Poniżej przycisków można wyświetlić tekst, poprzez wykonanie linii kodu:
gui.set_text('test', "Przykładowy tekst")
Wartość ‚test’ to identyfikator pola tekstowego. Pole to jest przydatne przy debugowowaniu – na początku pracy nad aplikacją miałem tylko drzewa na czarnym tle i potrzebowałem znaleźć optymalny odstęp między drzewami, w tym celu zrobiłem sobie trzy elementy gui: przycisk zwiększający odstęp, przycisk zmniejszający odstęp i etykietę wyświetlającą aktualny odstęp, dzięki takiemu rozwiązaniu mogłem ustalić interesującą mnie wartość bez potrzeby zmiany wartości odstępu w kodzie i ponownego uruchamiania aplikacji po każdej zmianie.
Podsumowanie
Polecam zapoznanie się z kodem, jeśli chcesz poznać sposoby rozwiązywania takich problemów jak:
1. Rysowanie na ekranie
2. Przekształcenia wzorów (skalowanie, zmiana kolorów)
3. Umieszczanie elementów na ekranie (np. proszę zobaczyć w jaki sposób góry o różnym rozmiarze są wyrównane do ich dolnej krawędzi)
4. Animacje elementów (przesuwanie chmur)
5. GUI i reagowanie na kliknięcia (przyciski restartujące góry, chmury i drzewa)
Repozytorium z kodem aplikacji: Landscape Generator
Skomentuj