Liczba wpisów do końca DPS: 1

Trzeba powoli kończyć grę. Po poprzednim wpisie gra wyglądała już całkiem fajnie, ale nie miała sensu - nie dało się ani wygrać ani przegrać. Kwestia wygranej jest właściwie jasna - nie da się ;) Po prostu gra toczy się aż gracz przegra, tyle. Zostaje w takim razie kwestia przegranej.

Tutaj chciałem wykorzystać doświadczenie nabyte przy pierwszej wersji gry czyli przeciwników i prymitywne wykrywanie kolizji. Przeciwników trzeba jakoś wrzucać do gry i tu przydały się te same mechanizmy które zastosowałem przy generowaniu krajobrazu. Stworzyłem więc kolejną klasę tym razem trzymającą typy przeciwników, dodałem ich obsługę przy ruchu krajobrazu i zastosowałem proste wykrywanie kolizji.

Kod odpowiedzialny za całą obsługę przeciwników wygląda następująco:

class Enemy(object):
    shoe = {
        "type": "shoe",
        "w": 40,
        "h": 40,
        "src": "./assets/shoe.png",
        "y": WINDOW_H - 90,
        "x": WINDOW_W,
        "min_v": 20,
        "max_v": 25,
        "v": 0
    }

    @classmethod
    def add_shoe(cls):
        shoe = cls.shoe.copy()
        shoe["v"] = random.randint(shoe["min_v"], shoe["max_v"])

        return shoe

# Stage:
# [...]
@classmethod
    def move(cls):
        # [...]

        # enemies
        for i, enemy in enumerate(cls.enemies):
            enemy["x"] -= enemy["v"]

            if enemy["x"] + enemy["w"] <= 0:
                del cls.enemies[i]

            cls.check_enemy_hit(enemy)

        # randomly create enemy but no more than n are allowed at the time!
        if 1 > len(cls.enemies):
            elif 2 > random.randint(0, 10):
                cls.enemies.append(Enemy.add_shoe())

    @classmethod
    def check_enemy_hit(cls, enemy):
        hit_from_above = cls.player.y + cls.player.h >= enemy["y"]

        hit_from_front = cls.player.x + cls.player.w >= enemy["x"]

        is_behind = cls.player.x > enemy["x"]

        if hit_from_above and hit_from_front and not is_behind:
            cls.game_over = True

Te “kilka” linijek kodu pozwoliło całkiem kompleksowo obsłużyć generowanie i zderzanie się z przeciwnikiem. Wystarczyło już tylko dodać metody które wyświetlą komunikat o przegranej i zastopują grę.

Jako ostatni element dodałem jeszcze punkty które lecą w czasie trwania ruchu gracza, nie ma nic lepszego niż rywalizacja ze swoimi własnymi rekordami ;)

Gra w tej chwili jest już “grywalna” więc jej tworzenie uznaję za “skończone”. Wiele się nauczyłem w tym czasie i napisałem bardzo prosty silnik gry, który teraz wystarczy wykorzystać, rozwinąć i wydać stworzoną na nim grę dla ludzi :)

Na podsumowanie będzie jeszcze czas w ostatnim wpisie na który już teraz zapraszam. Będzie podsumowanie i pisania gry i samego blogowania, więc będzie ciekawie :)