Máte PicoPad nebo jinou desku s mikrokontrolérem, displejem a pár tlačítky? Možná vás už napadlo vyrobit si vlastní hru. Nový projekt Vládi Smitky (MakerClassCZ) vám to umožní jednodušeji než kdy dříve.

Picogame je malý 2D herní engine postavený nad CircuitPython. Je napsaný pro mikrokontroléry jako je RP2040/RP2350 nebo různé ESP32. Primárně byl vytvářen pro konzoli PicoPad, ale lze ho provozovat na mnoha dalších deskách. Stačí jen přidat vhodný displej a pár tlačítek.
Na tomto enginu je zajímavé rozdělení úloh. Základem je jádro psané v C jako nativní CircuitPython modul starající se o rendering, skládání scén, kolize a další výpočetně náročnější úlohy. K němu je připravena sada Python knihoven, které řeší vstupy včetně USB gamepadu a klávesnice, animace, dialogy, zvuk i syntézu, částicové efekty, třesení obrazovky, ukládání skóre nebo kolize – tedy přesně ty části, které při psaní hry od nuly zaberou nejvíc času. Na vás je pak jen to nejdůležitější: vyřešit si herní logiku. To uděláte komfortně přímo v Pythonu, nečekají vás tedy žádné opakované kompilace a flashování firmware. CircuitPython deska se objeví jako běžný disk ve vašem PC a vy jen jednoduše v libovolném editoru upravujete code.py a okamžitě vidíte výsledek.
TIP: Pro picogame je možné vyvíjet a hrát také bez HW. K tomuto enginu totiž existuje desktopový i webový simulátor, ve kterém si můžete vše vyzkoušet.
Proč projekt vznikl?
Vláďa jako původní motivaci uvádí, že poté, co na PicoPad portoval CircuitPython, ho lákalo vytvořit v něm hru podle obrázku na jeho krabičce. To nakonec nebylo proveditelné, protože samotné displayio (zobrazovací vrstva CircuitPython) na to bylo moc pomalé a existující herní knihovna Stage příliš omezená (umožňuje používat jen objekty 16x16px). Začal tedy s hledáním způsobu, jak by šla Stage knihovna upravit tak, aby mohla používat sprity libovolné velikosti. Nakonec se ukázalo, že bude lepší to vzít od základu a udělat si kompletní engine tak, aby se mu dobře používal 🙂.
Ukázalo se, že Vláďa nebyl jediný, kdo se rozhodl vytvořit vlastní engine. Jelikož displayio je stavěné spíš na widgety a dashboardy než na hry a Stage knihovna je omezená a má problémy s novějšími verzemi CircuitPythonu, na Redditu a dalších komunitách se pravidelně objevuje otázka, jak řešit limity stávajících knihoven a jestli pro Pico existuje nějaký dobrý herní engine. Nezřídka to končí tím, že si tazatel začne psát vlastní engine v C.

Na čem picogame běží?
Referenčním zařízením je český PicoPad s RP2040 (modul Raspberry Pi Pico), displejem 320x240px, tlačítky a malým reproduktorem. Provozovat tento engine ale lze na téměř libovolné desce s podporou CircuitPython, která má zhruba 200kB RAM a displej s řadičem ST7789 nebo ILI9341 a s rozumným rozlišením.
Picogame se úspěšně rozběhl například na obecném Pico 1/2, Adafruit Feather S3 TFT, desce Pimoroni PicoSystem, nebo na výkonném Adafruit Fruit Jam. Právě Fruit Jam je druhá platforma, na kterou je picogame odladěný – řekla si o podporu USB periférií i možností většího rozlišení.
Aby zábava mohla začít, stačí jen na vaše zařízení nahrát CircuitPython firmware se zapnutou podporou picogame. Ten je zatím pro běžné desky předkompilovaný ke stažení na webu projektu a jsou výhledy, že by mohl být časem i oficiální.

Výkon
Je fér nejdřív říct, proti čemu zde bojujeme. Plné překreslení displeje po SPI je fyzikální strop, přes který se žádnou knihovnou nelze dostat. Měření na displayio ukazuje, že přenos celé obrazovky 240x240px při 64 MHz trvá kolem 144 ms, tedy necelých 7 snímků za sekundu – a to ještě dřív, než začnete cokoliv počítat. Trikem pro rychlejší překreslování je neposílat na displej nic, co se nezměnilo, a ten se picogame snaží maximálně využívat.
Přestože hru píšete v Pythonu, výsledná hra může být velmi rychlá. Picogame k tomu používá mnoho triků, kterými obchází 2 hlavní úzká hrdla – překreslování displeje po SPI a velikost RAM.
Displej PicoPadu má rozlišení 320x240px a překreslit ho celý chvilku trvá. Proto engine nepracuje s displejem jako s bitmapou, ale pracuje s konkrétními objekty na scéně (retained mode) a na displej posílá jen změněné čtverce (dirty rects), které chytře počítá. Dále jej překresluje jen v úzkých pruzích, které jsou zvoleny tak, aby procesor tak akorát stihl další pruh spočítat, zatímco se ten předchozí na pozadí odesílá na display.
Pro hry, kde se hýbe pár objektů a není tak potřeba každý frame překreslovat celou obrazovku, zvládá picogame desítky až jednotky stovek FPS. Pro představu demo příklad Bouncing Balls běžel v herní knihovně Stage PicoPadu při 115 FPS. Stejný kód (díky vrstvě kompatibility) v picogame běžel při 250 FPS.
Celá matematika v C části enginu je fixed point a například na goniometrické funkce se používají předpočítané tabulky. Autor přiznává, že se v mnoha ohledech inspiroval v PicoLibSDK Miroslava Němečka.
Druhým úzkým hrdlem je RAM a bývá to nejčastější důvod, proč hry v CircuitPythonu skončí dřív, než pořádně začnou. RP2040 má 264 kB SRAM, CircuitPython si vezme svoje a na hru zbydou jen desítky kilobajtů. Přitom plný framebuffer 320x240px v RGB565 by sám zabral přes 150 kB. K tomu se přidává fragmentace: volné paměti je sice dost, ale ne v jednom souvislém kuse. Picogame se oproti tomu snaží nealokovat velké paměťové bloky, nebo je alokovat na začátku paměti, a proto je úsporný.
Co jde v picogame udělat?
Omezený hardware neznamená jen Hada nebo Pong. Dalším testovacím projektem proto bylo přepsat hru Moon Miner, původně dělanou pro nabušené zařízení Adafruit Fruit Jam (RP2350, 8MB PSRAM, 16MB flash), běžící v rozlišení 640x480px. Po přepisu do picogame se hra více než 6x zrychlila a výsledný kód byl díky nativním funkcím engine o 40% menší. Zároveň ji bylo možné po dalších úpravách zprovoznit i na PicoPadu s mnohem slabším MCU RP2040.
S picogame postavíte prakticky celé portfolio retro žánrů – arkády a akční hry, střílečky, závody (i pseudo 3D), plošinovky, logické i karetní hry. Engine utáhne také hry s hlubší logikou, lze tak postavit například menší RPG s mapou světa, dialogy a tahovým soubojem (tutoriál zde). Do picogame autor naportoval i legendární Vlak se všemi 50 levely 🙂.
V repozitáři je mnoho ukázkových her různých žánrů, které lze použít jako startovací bod. Ty nevznikaly jen jako ukázky syntaxe, ale jako reálný playtest, podle kterého engine rostl. K vývoji patří i editor scén v prohlížeči, nástroje na převod grafiky z PNG a mnoho dalších pomůcek.
Všechny připravené hry si lze vyzkoušet i přímo v prohlížeči.
Vláďovy oblíbené hry, které v picogame vytvořil, jsou Corona – akční survival arena plná pohybujících se objektů – a klidná karetní hra Picatro, inspirovaná populárním Balatrem.
Jak začít?
Nejjednodušší cesta, jak picogame prozkoumat, je projít tutoriál na webu, kde si krok po kroku zkusíte vytvořit 3 jednoduché hry. Na to ani nepotřebujete HW, vše lze zkusit v emulátoru přímo na webu.
Pokud chcete jít HW cestou, tak je nejjednodušší použít PicoPad nebo obdobnou desku s pár tlačítky a displejem. Podporovaný je také Adafruit Fruit Jam s DVI/HDMI výstupem a ovládáním přes USB gamepad nebo klávesnici.
Pro tyto herní desky si můžete stáhnout i připravené balíčky her s launcherem, které stačí na zařízení jednoduše nahrát.

Pokud takovou desku nemáte, je jednoduché ji vyrobit. Stačí vám modul Raspberry Pi Pico (ideálně ve verzi 2), SPI displej (ideálně ST7789 320x240px), pár tlačítek a případně pasivní piezo buzzer/malý repráček. Když navíc použijete zapojení podle referenčního PicoPadu, bude fungovat firmware pro něj určený bez potřeby úprav konfigurace.
Závěr
Picogame je engine, který vám umožní postavit si poměrně jednoduše vlastní hru i na deskách, které dnes už mají to nejlepší za sebou a práší se na ně v šuplíku. A pokud žádné vhodné zařízení nemáte? Nevadí, můžete si vyzkoušet vývoj alespoň online na webu projektu, nebo si tamtéž zahrát již předpřipravené gamesy. Celý projekt je open source a najdete ho na GitHubu.











Žádné sociální komentáře k dispozici.