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:
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.
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.
Dá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:
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.
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.
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