Picogame: herní engine pro CircuitPython

Stručně: Picogame je open source 2D herní engine pro CircuitPython. Nativní jádro v C se stará o vykreslování, scény a kolize, herní logiku píšete v Pythonu – bez opakované kompilace a flashování firmware. Běží na deskách s RP2040/RP2350 nebo ESP32 (PicoPad, Pico 1/2, Adafruit Fruit Jam, Pimoroni PicoSystem) s displejem ST7789 nebo ILI9341 a zhruba 200 kB RAM. Vyzkoušet si ho můžete i úplně bez hardwaru ve webovém simulátoru.

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.

Hry vytvořené v picogame

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.

Picopad box

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í.

Zapojení PicoPadu na breadboardu

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.

picogame hra Corona
picogame hra Picatro

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.

webový emulátor

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.

picogame launcher

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.

Rozcestník:

Ptáte se

Proč nepoužít rovnou displayio nebo knihovnu Stage?

displayio je stavěné spíš na widgety a dashboardy než na herní smyčku – plné překreslení obrazovky 240x240px po SPI trvá kolem 144 ms, tedy necelých 7 snímků za sekundu. Herní knihovna Stage zase umožňuje používat jen objekty 16x16px a má potíže s novějšími verzemi CircuitPythonu. Picogame posílá na displej jen změněné oblasti a nabízí sprity libovolné velikosti, kolize, kameru, zvuk i ukládání skóre.

Jaký výkon od picogame čekat?

U her, kde se hýbe jen pár objektů a není třeba překreslovat celou obrazovku každý frame, zvládá picogame desítky až jednotky stovek FPS. Demo Bouncing Balls běželo na PicoPadu v knihovně Stage při 115 FPS, ten samý kód v picogame při 250 FPS. Hra Moon Miner se po přepisu do picogame zrychlila více než 6x a její kód byl o 40 % menší. Výsledná rychlost vždy závisí na tom, jak velká část obrazovky se mezi snímky mění.

Jakou desku a kolik paměti picogame potřebuje?

Stačí téměř libovolná deska s podporou CircuitPython, zhruba 200 kB RAM a displejem s řadičem ST7789 nebo ILI9341 v rozumném rozlišení. Referenčním zařízením je PicoPad s RP2040, ale engine běží i na obecném Pico 1/2, Adafruit Feather S3 TFT, Pimoroni PicoSystem nebo Adafruit Fruit Jam. Picogame nedrží plný framebuffer (ten by při 320x240px v RGB565 sám zabral přes 150 kB) a snaží se velké paměťové bloky nealokovat, aby se vešel do 264 kB SRAM sdílených s CircuitPythonem.

Musím při každé změně hry kompilovat a flashovat firmware?

Ne. CircuitPython firmware s podporou picogame nahrajete na desku jednou. Ta se pak připojí k počítači jako běžný disk, vy jen v libovolném editoru upravíte soubor code.py a výsledek vidíte okamžitě. Předkompilovaný firmware pro běžné desky je ke stažení na webu projektu.

Můžu picogame zkusit bez hardwaru?

Ano. K enginu existuje desktopový i webový simulátor, ve kterém hru napíšete i odladíte přímo v prohlížeči. Na webu projektu je také tutoriál, kde si krok po kroku vytvoříte tři jednoduché hry, a všechny hotové ukázkové hry si lze rovnou zahrát online.

Můžu mít na zařízení víc her najednou?

Ano. Pro PicoPad a Adafruit Fruit Jam jsou ke stažení připravené balíčky her včetně launcheru, který stačí na zařízení nahrát a hry pak přepínat přímo v něm.

Jaké žánry her jdou v picogame postavit?

Prakticky celé portfolio retro žánrů – arkády a akční hry, střílečky, závody včetně pseudo 3D, plošinovky, logické i karetní hry. Engine utáhne i hry s hlubší logikou, například menší RPG s mapou světa, dialogy a tahovým soubojem. V repozitáři je řada ukázkových her různých žánrů, které lze použít jako startovací bod.
Sdílejte článek:
Ukaž světu,
že jsi Maker!
Koupit tričko
Kafe pro Chiptrona
Dodej energii dalšímu článku

Související články

Různé vývojové desky s čipy ESP32 – srovnání variant

ESP32, S2, S3, C3, C6, H2, C5, P4 i chystaný S31 – který čip vybrat pro váš projekt? Srovnávací tabulka periferií, rozhodovací strom podle use-case, přehled softwarových platforem a tipy, kde koupit vývojové desky v Česku.

Tento článek vznikl jako reakce na dlouholetou diskuzi 3D tiskařů – čím ochránit majetek a samozřejmě i zdraví v případě, když se zařízení samovolně vznítí? Jaká jsou práva spotřebitelů při nákupu produktu v České republice a z Asie? Samozřejmě se…

CH32V003 návod

Mikrokontroléry CH32V – určitě jste už o nich slyšeli. Prodávají se za naprosto směšnou cenu, ale mají velmi slušnou výbavu a navíc se prodavají v dobře pájitelném pouzdře. Mezi periferiemi najdete mimo klasických GPIO i SPI, ADC, UART, I2C, časovače…

Abyste si začali hrát a programovat Arduino Uno, ESP32 nebo Raspberry Pi Pico, tak je nutně nepotřebujete mít na stole.

EasyEDA je volně použitelný webový nástroj určený pro návrh elektronických schémat, návrh DPS a obvodovou simulaci. Celý nástroj běží ve webovém prohlížeči – není nutné nic instalovat a odpadá přenášení projektů mezi počítači. Stačí internetový prohlížeč a jste připraveni kreslit…

Open-source repozitář se stovkou IoT projektů na ESP32, ESP8266 a Raspberry Pi Pico v MicroPythonu. Chytré zavlažování, RFID zámek, detekce plynu, WiFi robot a meteostanice – s kódem i zapojením. Aktualizace: interaktivní přehled projektu. Vyberte si desku a zaměření projektu…

Trendy