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

  1. Generuje elementy krajobrazu używając technik programistycznych
  2. Opiera się na losowości
  3. 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

Udostępnij
Tags:

Skomentuj