Liczba wpisów do końca DPS: 3

Zabrałem się za tworzenie dynamicznego tła dla planszy. Miałem już całkiem fajnie wyczyszczony kod ze zbędnych funkcji i klas. Żeby graczowi nie nudziła się monotonna sceneria stworzyłem dwie proste grafiki: chmury i drzewa, które miały wypełnić pusty i smętny krajobraz. I znów przyszła mi z pomocą prosta webowa aplikacja do tworzenia pikselowatych grafik: https://make8bitart.com/

Teraz musiałem zająć się tworzeniem obiektów. Wymyśliłem, że stworzę prostą klasę która będzie trzymała definicje obiektów krajobrazu oraz będzie udostępniała metody do pobierania tychże. Dla chmury definicja wygląda następująco:

cloud = {
    "type": "cloud",
    "w": 50,
    "h": 50,
    "src": "./assets/cloud.png",
    "y": 0,
    "x": 0,
    "max_y": WINDOW_H - 100,
    "max_x": WINDOW_W - 100
}

@classmethod
def get_cloud(cls):
    cloud = cls.cloud.copy()
    cloud["y"] = random.randint(0, cloud["max_y"])
    cloud["x"] = random.randint(0, cloud["max_x"])

    return cloud

Zasada jest prosta: przy pobieraniu nowej chmury losowane są dla niej wartości x i y - po to, żeby chmury pojawiły się w losowych miejscach ale w określonych (przez max_x i max_y) ramach.

Losowanie krajobrazu ma miejsce jednorazowo podczas startu gry. No ale żeby nie było monotonnie (wspominanie o braku monotonii robi się monotonne… ;P) tło mogłoby się poruszać razem z graczem. To wymaga prostego sprawdzenia czy obiekt nie zniknął poza polem widzenia (if element["x"] + element["w"] <= 0:) i jeśli tak to zapisania typu obiektu do odtworzenia oraz usunięcia go z pierwotnej kolekcji.

Do tworzenia nowych obiektów w trakcie gry nie mogłem już użyć getterów danych obiektów - one zawsze losują pozycję x obiektu a chciałbym, żeby obiekty pojawiały się na początku planszy. Może nie jest to jasno napisane, więc wyobraźcie sobie, że jedziecie samochodem i drzewa was mijają. Nowe nie pojawiają się losowo tylko zawsze “wychodzą” z przodu - i o to mi właśnie chodziło ;)

Wymagało to nieludzkiego wysiłku w postaci napisania następującej metody:

@classmethod
def add_cloud(cls):
    cloud = cls.cloud.copy()
    cloud["y"] = random.randint(0, cloud["max_y"])
    cloud["x"] = WINDOW_W

    return cloud

Jest bliźniaczo podobna do get_cloud z tym, że pozycja x zawsze ustawiana jest na maksymalną szerokość okna która definiuje wielkość planszy.

Efekt jest zadziwiająco fajny :)