3D schodiště v GameMakeru
Ačkoli byl program Game Maker vytvořen primárně pro tvoru 2D her, jeho plná verze podporuje i hry ve 3D. Názory na smysluplnost tvorby 3D her v GM se různí - existují jak přívrženci, tak i přesvědčení odpůrci. Pravdou je, že 3D tvorba v GM je značně omezená, až primitivní. GM zvládá vykreslení pouze elementárních těles typu krychle či válce, postrádá možnost jednoduchého importu prostorových těles vytvořených v jiných programech atd. Tvořit 2D skákačky je sice pěkné, ale teprve přechod do 3D je to pravé, protože tvoříme simulaci našeho světa v PC. Tvorba her ve 3D grafice je ovšem velice složitá a zdlouhavá, pomocí různých "klikátek" těžko zrealizovatelná. Nabízí se využít XNA. Tato platforma se jeví svou obrovskou potencí jako dokonalý nástroj pro tvorbu her, ač už 2D nebo 3D, ovšem kdo nevládne C#, nevládne ani XNA. Pro vývojáře-začátečníka se tedy cesta stáčí opět k Game Makeru. Osobně vidím situaci tak, že rozumný způsob proniknutí do tvorby 3D her je vytvořit první 3D projekt v GM a poté přejít do sféry profesionálnější, např. do výše zmíněného XNA. Proto jsem se rozhodl napsat tento článek, abych ukázal, že i při použití jednoduchého kódu GM zvládne vytvořit zajímavé věci, nezbytných v běžných 3D hrách.
Jako příklad jsem zvolil schodiště. Jak ve 3D módu zajistit, aby v FPS hře kamera reagovala na schody a umožnila na ně vystoupit a sestoupit? Hledal jsem nějaké smysluplné řešení, ale i v zahraničních diskuzích lidé pouze doporučovali vytvořit spoustu objektů, přičemž každý by při kolizi s kamerou zvýšil/snížil její výšku o určitou hodnotu na prostorové ose z. tento způsob řešení zdá se mi poněkud nešťastný, vývojář je nucen kvůli každému jednomu schodu zvlášť vytvořit nový objekt a umístit do do místnosti. Co mi tedy zbývalo nežli najít způsob vlastní. Výsledek se mi zdá uspokojivý, proto jsem se ho rozhodl zveřejnit
Jako první si v GM vytvoříme nový objekt, do kterého napíšeme veškerý kód pro vykreslení schodišť, poté můžou přijít sněny apod. Do eventu Draw napíšeme kód pro vykreslení podlahy a bloku, který bude za chvíli tvořit první schod našeho schodiště.
d3d_draw_block(0,160,0,100,180,10,background_get_texture(textura),4,1);
Hru spustíme, výsledek by měl vypadat nějak takto:
Pěkné. Pokud s FPS kamerou přes tento schodek přejdeme, samozřejmě se nic nestane. Je asi jasné, že poloha kamery ve výšce nemůže být pevně daná, ale že musí být její výška proměnlivá, aby umožňovala pohyb po schodišti nahoru a dolů. Vytvoříme tedy promněnou pro výšku kamery, nazveme ji logicky z. Aby se kamera nacházela dole na zemi, přidáme k ní nějakou hodnotu, já zvolil 60. V kódu pro kameru by tedy mělo vzniknout něco jako toto:
d3d_set_projection(x,y,z+60,x+cos(direction*pi/180),y-sin(direction*pi/180),z+59.7, 0,0,1);
Hurá na vytvoření funkčního schodiště. Nejdříve musí GM ověřit, zda se x-ová a y-ová pozice kamery nachází na schodu.
Pozice kamery tedu musí být větší než body x min a y min a zároveň menší než body x max a y max. Tím se zajistí, že se kamera nachází na schodu. Nyní se již můžeme vrhnout na napsání funkce umožňující vrácení výšky schodu, která se přičte k výšce kamery. Funkce se v GM tvoří jako skripty. Klikněte na "Create a script". Otevře se soubor pro psaní kódu. V kolonce name script pojmenujeme. Pokud upravujeme již existující funkci, jako třeba teď, je pěkný zvyk jako jméno skriptu použít jméno upravované funkce, ale s koncem rozšířeným o popis funkce. My budeme používat funkci pro vykreslení bloku, název jsem tedy zvolil d3d_draw_block_z. Do skriptu vložíme následující kód:
d3d_draw_block(argument0,argument1,argument2,argument3,argument4,argument5,argument6,argument7,argument8); if(o_player.x < argument3 and o_player.x > argument0 and o_player.y < argument4 and o_player.y > argument1) o_player.z = argument5;
V první části je funkce vykreslující blok, tedy náš schod. Argumenty 0 - 8 reprezentují atributy funkce, tedy pozici, použitou texturu atd. Jasné. Podmínka if tvoří samotné jádro problému "Jak vytvořit schodiště". Podmínka zkontroluje, zda se pozice kamery nachází na schodu, jak jsem popisoval dříve (u mě kameru vykresluje objekt o_player, vy si tedy kód vhodně přepište). Pokud je podmínka platná, funkce přiřadí proměnné z (výšce kamery) atribut argument5, tedy hodnotu z2 - výšku schodu. No a to je vše! Jak jednoduché. V kódu kamery se k hodnotě z přičte konstanta 30 a kamera se zvedne.
Nyní se vrátíme do draw eventu objektu, který zajistil vykreslení nefunkčního schodu a funkci d3d_draw_block přepíšeme na d3d_draw_block_z. atributy necháme stejné. Hru spustíme a co se nestane! Pokud jsme vše napsali správě, kamera na schod opravdu zareaguje a zvedne se od země o hodnotu 10!! Blahopřeji. Teď již již můžeme tvořit libovolná schodiště, jen si musíme dát pozor, abychom je nevytvořili nad sebou. Pak by totiž GM nevěděl, na který schod má reagovat (protože pokud jsou schody nad sebou, mohou se překrývat jejich x-ové a y-ové souřadnice). Ještě doplním přidám kód pro vykreslení schodiště.
d3d_draw_block_z(0,160,0,100,180,10,background_get_texture(textura),4,1); d3d_draw_block_z(0,140,0,100,160,20,background_get_texture(textura),4,1); d3d_draw_block_z(0,120,0,100,140,30,background_get_texture(textura),4,1); d3d_draw_block_z(0,100,0,100,120,40,background_get_texture(textura),4,1); d3d_draw_block_z(0,0,0,100,100,50,background_get_texture(textura),4,4); d3d_draw_block_z(100,0,0,120,100,60,background_get_texture(textura),1,4); d3d_draw_block_z(120,0,0,140,100,70,background_get_texture(textura),1,4); d3d_draw_block_z(140,0,0,160,100,80,background_get_texture(textura),1,4); d3d_draw_block_z(160,0,0,180,100,90,background_get_texture(textura),1,4); d3d_draw_block_z(180,0,0,200,100,100,background_get_texture(textura),1,4);
Určitě si hned všimnete, že ovládání je těžkopádné a pokud se snažíte "vyjít" mimo oblast schodiště, zůstanete stále ve výšce daného schodu, nespadnete na zem. Tento nedostatek by šel eliminovat nějakou kontrolou výšky schodu a kamery, ale zdá se mi to zbytečně složité a nepraktické. Lepší mi přijde postavit kolem schodiště zdi, aby hráč nemohl mimo ně. Na lepší ovládání pro FPS hru, i na rozumné řešení zdí (opět bez nutnosti objektu pro každou zeď zvlášť) se podíváme někdy příště.
V příloze si můžete stáhnou kompletní zdrojový kód.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 575x (105.8 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker