Tutoriály Pygame
Úvod do Pygame

autor: Pete Shinners pete@shinners.org
překlad: Pavel Kosina pkosina@seznam.cz

Tento článek je úvodem do modulu Pygame pro programátory jazyka Python. Originál anglické verze se objevil v Py Zine, svazek 1 číslo 3. Tato verze obsahuje drobné změny, aby byl článek povšechně lepší. Pygame je pythonýrská rozšiřující knihovna, která obaluje knihovnu SDL a její pomocníky.

Historie

Pygame vznikla v létě roku 2000. Objevil jsem jak Python tak SDL ve stejnou dobu v čase, kdy jsem byl mnoho let programátorem v C. Vy již znáte Python, který byl v té době ve verzi 1.5.2. Asi ale budete potřebovat úvod do SDL, což je zkratka pro Simple Directmedia Library. SDL, kterou vytvořil Sam Lantinga, je multi-platformní knihovna jazyka C na ovládání multimédií, srovnatelná s DirectX. Byla již použita ve stovkách komerčních a open sourcových hrách. Byl jsem překvapen, jak čistě a přímočaře vypadaly oba projekty a odtud již nebylo daleko k nápadu, že namixování Pythona a SDL by mohlo být zajímavé.

Objevil jsem malý projekt ve vývoji s tím samým nápadem - PySDL. PySDL, který vytvořil Mark Baker, byla přímočará implementace SDL jako pythonýrského rozšíření. Vypadal čistěji než generické obalení přes SWIG, ale cítil jsem v tom silný vliv "stylu C". Náhlá smrt PySDL byla pro mě výzvou k založení svého vlastního nového projektu.

Chtěl jsem vytvořit projekt, který by skutečně obsahoval výhody Pythonu. Mým cílem bylo, aby se jednoduché věci dělaly jednoduše a složité věci přímočaře. Pygame se narodila v září 2000. O šest měsíců později byla uvolněna verze 1.0.

Ochutnávka

Nejlepší cestou pro pochopení nové knihovny je podle mne skok po hlavě přímo do příkladu. V raných dobách Pygame jsem vytvořil animaci skákajícího míče na 7 řádkách kódu. Podívejme se na přátelštější verzi toho samého. To by mělo být dostatečně snadné na sledování. Kompletní rozbor následuje.


import sys, pygame                                          #1
pygame.init() #2
#3
velikost = sirka, vyska = 320, 240 #4
rychlost = [1, 1] #5
cerna = 0, 0, 0 #6
#7
screen = pygame.display.set_mode(velikost) #8
#9
micek = pygame.image.load("micek.gif") #10
micekRect = micek.get_rect() #11
#12
while 1: #13
for udalost in pygame.event.get(): #14
if udalost.type == pygame.QUIT: sys.exit() #15
#16
micekRect = micekRect.move(rychlost) #17
if micekRect.left < 0 or micekRect.right > sirka: #18
rychlost[0] = -rychlost[0] #19
if micekRect.top < 0 or micekRect.bottom > vyska: #20
rychlost[1] = -rychlost[1] #21
#22
screen.fill(cerna) #23
screen.blit(micek, micekRect) #24
pygame.display.flip() #25

Na jednoduchou animaci stačí tento příklad. Na začátku vidíme importování a inicializaci, ke které snad není co dodat. Příkaz import pygame importuje balíček se všemi dostupnými moduly, které Pygame obsahuje. Volání pygame.init() inicializuje každý z těchto modulů.

Na řádce 8 jsme vytvořili grafické okno voláním pygame.display.set_mode(). Spojením Pygame a SDL činí snadným nastavení nejlepšího grafického módu pro grafický hardware. Mód můžete přepsat a SDL nahradí vše, co hardware nedokáže. V Pygame je pozadí reprezentováno jako objekt Surface (Plocha). Funkce display.set_mode() vytváří nový objekt Surface, na který se zobrazuje aktuální grafický objekt. Jakákoliv kresba, kterou učiníte na tento Surface, bude vidět na monitoru.

Na řádce 10 nahráváme obrázek míče. Nezapomeňte uložit soubor s obrázkem (micek.gif) do stejného adresáře jako máte tento program, aby vám program fungoval. Můžete použít obrázek míče, který je výše vedle kódu programu. Pygame podporuje spoustu formátů obrázků přes knihovnu SDL_image, včetně JPG, PNG, TGA, a GIF. Funkce pygame.image.load()vrací Surface s daty míče. Surface zachovává jakoukoliv klíčovou barvu nebo alfa průhlednost ze souboru. Po nahrátí obrázku míče vytvoříme proměnnou jménem micekRect. Pygame přichází s pohodlnou utilitou jménem Rect, která reprezentuje obdélníkovou oblast. Později, v části animace, uvidíme co objekty Rect mohou dělat.

Na tomto místě, na řádce 13, je náš program inicializován a připraven k běhu. Uvnitř nekonečné smyčky kontrolujeme uživatelův vstup, posunujeme s míčem a pak míč vykreslujeme. Pokud jste obeznámeni s GUI programováním, máte tak zkušenost s událostmi a událostními smyčkami. V Pygame není rozdílu, takže když se stane událost QUIT (což je uzavření ookna), jednoduše program opustíme. Pygame zajistí čisté uzavření.

Je čas na aktualizaci pozice našeho míče. Řádky 17 - 21 posunují proměnnou micekRect určenou rychlostí. V případě, že míč se vysunul mimo obrazovku, obrátíme směr pohybu. Není to přesně Newtonovská fyzika, ale nám stačí.

Na řádce 23 smažeme obrazovku jejím vybarvením černou RGB barvou. Toto může vypadat zvláštně, pokud jste nikdy nepracovali s počítačovými animacemi. Možná se ptáte: "Proč musíme něco mazat, proč jednoduše neposuneme míč po obrazovce?" Tohle ale není obvyklá cesta počítačové animace. Animace není ničím více než sledem jednotlivých obrázků, jejichž postupné zobrazování vcelku slušně oklame lidské oko tak, že vidí plynulý pohyb. Obrazovka je prostě samostatný obrázek, který uživatel vidí. Kdybychom si nedali tu práci s mazáním míče z obrazovky, viděli bychom "stopu" míče, jak ho budeme vykreslovat na obrazovku v nových a nových pozicích.

Na řádce 24 vykreslíme obrázek míče na obrazovku. Vykreslování obrázků je obsluhováno metodou Surface.blit(Zdroj, Cíl). Blit (Vykreslení) značí v základě kopírování pixelů barev z jednoho obrázku do druhého. Předáváme metodě blit Zdroj, ze kterého se má kopírovat a pozici , kam umístit v Cíli, (případně možno přímo Cíl, jako v našem případě, pokud je to Rect).

Poslední věc, která je třeba udělat, je aktualizovat display. Pygame řídí display pomocí dvojité vyrovnávací paměti. Jakmile jsme dokončili vykreslování, zavoláme metodu pygame.display.flip(). To zobrazí konečně vše, co jsme jsme vykreslili, na obrazovce Surface. Dvojitá vyrovnávací paměť zajišťuje, že uvidíme skutečně jen plně vykreslené věci na obrazovce. Bez toho by uživatel mohl vidět napůl vykreslené části, jak se postupně na obrazovce vytváří.

Toto uzavírá krátký úvod do Pygame. Pygame má také moduly jako například ošetření vstupu z klávesnice, myši i joysticku. Umí mixovat audio a dekódovat proudovou hudbu. Pomocí Surface můžete kreslit jednoduché tvary, rotovat, zvětšovat nebo zmenšovat obrázky. Dokonce je možná pixelová manipulace s obrázkem v reálném čase za použití matic modulu Numeric Python. Je zde dále MPEG přehrávání video a audio CD podpora. Pygame může také tvořit multiplatformní zobrazovací vrstvu pro PyOpenGL. Většina modulů Pygame jsou napsány v C, jen pár z nich je udělána v Pythonu.

Webová stránka Pygame obsahuje plnohodnotnou referenční dokumentaci pro každou funkci Pygame i tutoriály pro všechny možné druhy uživatelů. Zdroje Pygame přichází s mnoha příklady jako strkání do opice nebo sestřelování UFO.

Python a hry

"Je Python vhodný na tvorbu her?" Odpověď je: "Záleží na hře."

Python je skutečně vcelku schopný na hraní her. Dokáže dokonce překvapit, kolik je toho možné stihnout za méně než 30 milisekund. Na druhou stranu, není těžké dostat se k horní mezi, jakmile se program stává složitějším. Jakákoliv hra běžící v reálném času si pro sebe zabere plné využití počítače.

Během posledních několika let nastal zajímavý posun ve vývoji her, posun směrem k vysokoúrovňovým jazykům. Obvykle je hra rozdělena na dvě hlavní části. Na herní základ - engine, který musí být tak rychlý jak je to jen možné a na herní logiku, která vlastně nutí engine něco dělat. Není to tak dávno, kdy herní engine byl psán v assembleru a části kódu v C. Nyní se C posunul na herní základ, zatímco vlastní hra je psána ve vysokoúrovňovém jazyce. Hry jako Quake 3 nebo Unreal spouští tyto skripty jako přenositelný bytekód.

Na začátku roku 2001 vývojáři z Rebel Act Studio dokončili svou hru: Blade of Darkness. Za použití jejich vlastního 3D enginu je zbytek hry napsán v Pythonu. Hra je střílecí akcí z perspektivy třetí osoby. Ovládáte středověké válečníky ve složitých smrtelných útocích při objevování hradů a zámků. Můžete si stáhnout přídavky třetích stran pro tuto hru a ujistit se, že nejsou ničím jiným než pythonýrskými zdrojovými soubory.

Python byl nedávno základem her jako Freedom Force a Backyard Sports Series.

Pygame a SDL vytváří excelentní C engine pro 2D hry. Hry stále spotřebovávají nejvíce svého času uvnitř SDL na obsluhu grafiky. SDL může těžit z hardwarové grafické akcelerace. Povolení tohoto může změnit hru z běhu okolo 40 snímků za sekundu na rychlost přes 200 snímků za sekundu. Když vidíte svůj Python běhat na 200 snímcích za sekundu, uvědomíte si, že Python a hry mohou spolupracovat.

Je působivé sledovat, jak Python s SDL fungují na různých platformách. V květnu 2001 jsem pustil do světa můj plně pygamový projekt SolarWolf, arkádovou akční hru. Jedna věc mě překvapovala, že ani rok poté nebylo třeba žádné záplaty, opravy chyb anebo aktualizace. Hra byla vyvinuta plně pod windows, ale fungovala na Linuxu, Mac OSX a mnoho Unixech bez jakékoliv extra práce z mé strany.

Nicméně jsou zde zcela jasná omezení. Nejlepší cesta ke zvládání hardwarově akcelerované grafiky není vždy cesta k rychlejším výsledkům softwarového renderování. Hardwarová podpora není dostupná na všech platformách. Jakmile se hra stává složitější, musí se člověk přiklonit k jedné nebo druhé cestě. SDL má některé další návrhové omezení, věci jako celoobrazovková rolovací grafika může dostat vaši k nehratelným rychlostem. Ačkoliv SDL není vhodná na všechny typy her uvědomte si, že společnosti jako Loki používají SDL k běhu širokého rozsahu maloobchodních kvalitních titulů

Pygame je poměrně nízkoúrovňová, když se dostaneme k psaní programů. Brzy zjistíte, že potřebuje zabalit běžné funkce do vašeho vlastního herního prostředí. Báječná věc na tom je to, že není nic uvnitř pygame, co by vám stálo v cestě. Váš program má vše plně pod kontrolou. Vedlejší efekt tohoto je ten, že si půjčujete kousky kódy, abyste získali dokonalejší strukturu (framework). Budete potřebovat lepší porozumění toho, co děláte.

Závěr

Vývoj her je velmi vděčná záležitost, je na něco vzrušujícího být schopen vidět a interaktivně ovládat kód, který jste napsali. Pygame se v současnosti používá v téměř 30 dalších projektech. Mnoho z nich je již nyní hratelných. Možná budete překvapeni návštěvou webové stránky Pygame, když uvidíte co jsou ostatní lidé schopni s Pythonem udělat.

Moji pozornost upoutala jedna věc, a to počet lidí přicházející k Pythonu poprvé, aby si vyzkoušeli nějakou hru. Chápu proč hry přitahují nové programátory, ale může to být složité, protože tvorba her vyžaduje jemnější pochopení jazyka. Snažím se podporovat tento typ uživatelů, kteří jsou nováčky v tomto pojetí, psaním mnoha příkladů a tutoriálů Pygame.

Moje rada na konec zní: v jednoduchosti je síla. Zdůrazňuji to, jak to jen jde. Pokud přemýšlíte, jak vytvoříte svou první hru, máte toho spoustu, co se musíte naučit. Dokonce i jednodušší hra je výzvou pro váš návrh. Složitější hry neznamenají automaticky více legrace. Když ovládáte Python, můžete za pomoci pygame vytvořit jednoduchou hru za jeden až dva týdny. Od té chvíle budete potřebovat podivuhodně hodně času na uhlazení hry do formy, která se dá zveřejnit.

Přehled pygamových modulů

cdrom
cursors
display
draw
event
font
image
joystick
key
mouse
movie
sndarray
surfarray
time
transform
řízení cdrom mechaniky a přehrávání audia
nahrává obrázky kurzorů, včetně standardních
ovládá display okno nebo obrazovku
kreslí jednoduché tvary na Plochu
ovládá události a frontu událostí
vytváří a renderuje Truetype písma
ukládá a nahrává obrázky
ovládá joystick
ovládá klávesnici
ovládá myš
přehrávání mpeg videí
řízení zvuků pomocí Numeric
řízení obrázků pomocí Numeric
řízení časování
škálování, rotování a překlápění obrázků