Jak vytvořit krátkou hru v Pythonu
18.03.2020
Jak vytvořit krátkou hru v Pythonu

Pokud jste se někdy chtěli naučit, jak se vlastně dělají hry, nebude k tomu snad vhodnější čas než po večerech, když se v období nynější pandemie stejně moc nikam nedá jít. V tomto článku se podíváme na to, jak v jazyce Python udělat malý klon legendární hry Space Invaders. Postačí nám k tomu framework PyGame, který zajistí vše od ovládání až po grafické objekty.

Základní nastavení

Nejprve vytvořím třídu Game, ze které budu ovládat celou hru. Pak inicializuji pygame instanci a pole pro alieny (nepřátele), nastavím velikost zobrazované plochy (na ní se budou vykreslovat herní objekty), rychlost překreslování na 60 snímků za sekundu a spustím herní "smyčku", ve které se průběžně budou kontrolovat vstupní klávesy, kliknutí myši a vykreslovat grafika.


Vytvoříme si nepřátele

V klasické hře Space Invaders jsou hlavními nepřáteli alieni, které musí hráč všechny pobít. V této hře vytvořím jednoduchý objekt Alien, který použije souřadnice, barvu a velikost a vykreslí objekt ve formě čtverce na herní plochu. Objektu nastavím "klesání" o 5 % velikosti pixelu za jeden herní snímek. Instanci aliena pak vytvořím před herní smyčkou a v herní smyčce volám metodu draw pro vykreslení. 

Poznámka: Část kódu se vkládá do již napsané sekce. Pro přesné umístění se můžete podívat do kompletního zdrojáku, který je nalinkovaný na konci článku.


Po spuštění vypadá hra následovně, zatím jen s jedním Alienem - za chvíli jich vytvořím celé pole: 

 1.gif

Hlavní hrdina

Hrdina, kterého ovládá hráč, je vytvořen obdobně jako Alien, pouze má jiné rozměry, pozici dole v centru herní plochy, jinou barvu a bude na něj napojeno ovládání klávesami.


2.gif


A teď tomu dodáme šťávu!

Nejprve přidám více nepřátel. Pro to postačí jednoduchý generátor Alienů, kterými zaplním horní polovinu plochy (height/2) a v herní smyčce vykreslím.



3.gifDále přidám hrdinovi nějaké útočné prostředky - tedy rakety. Objekt rakety má také vlastní třídu, která je skoro stejná jako Alien a Hero, jen má důležitou vlastnost - a totiž, že po herní ploše "letí" nahoru - a to rychlostí 2 pixely za snímek. Vykreslovací plocha je indexovaná od levého horního rohu (x=0, y=0), proto je nastavena y souřadnice do mínusu (hráč je na cca (x=300, y=380). V herní smyčce pak kontroluji, zda hráč stisknul mezerník a pokud ano, vytvořím raketu na pozici hrdiny.

Střela po stisknutí mezerníku letí nahoru:

4.gif 

Teď už jen stačí přidat kontrolu kolize rakety a aliena (v tom případě jsou alien i raketa zničeny). Otázkou je, zda bude kontrolovat alien, že do něj narazila raketa, nebo jestli raketa bude kontrolovat, zda narazila do aliena. Volím kontrolu z pozice aliena. Každý alien sleduje seznam raket a kontroluje, zda do něj nějaká nenarazila (dívá se na souřadnice x a y). Je to opravdu triviální a neoptimální kontrola, běžně se samozřejmě používají optimalizované přístupy jako kontrola pouze těch objektů v blízkosti atd.


5.gif

Nakonec přidám pohyb hrdiny doleva a doprava, nastavím konečné podmínky pro výhru a prohru - když hráč všechny zničí vs. když alien přistane na zemi - a hra je hotova.

 

6.gif 

Závěrem

Výsledná hra by se ještě dala okořenit efekty jako jsou zvuky, textury a hlavně "game feel" mechaniky, např. třepání obrazu při každém výstřelu, pozastavení hry na 50 ms při každém výbuchu pro umocnění dopadu rakety a jiné běžné používané efekty (více o game feel zde). Kompletní kód hry jsem umístil na svůj github.

Framework PyGame, který jsme si zde ukázali je vhodný pro jednoduché projekty, ale pokud vás herní vývoj více zaujal, doporučuji "dospělé" herní frameworky jako Unity, používající jazyk C#; Game Maker Studio 2 používající jazyk GML; a nebo Unreal Engine 4, stojící na verzi jazyka C++. Nejvhodnější pro začátečníky je však Unity a GMS2. Přeji happy coding!

 

Jan Jileček