3D schodiště v GameMakeru

Ostatní jazyky GameMaker 3D hry 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ženo 543x (105.8 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal jendahruby
Avatar

Jak se ti líbí článek?
Celkem (10 hlasů) :
4.74.74.74.74.7


 


Miniatura
Všechny články v sekci
GameMaker - 3D hry

 

 

Komentáře
Zobrazit starší komentáře (4)

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

Ty bereš jako fakt, že 3D hra musí kopírovat realitu. Já moc rád hraji staré 3d hry typu Wolfenstein 3D, které vypadají dost jinak, než když se dívám z okna a fakt mě to baví a líbí se mi to. Na takové je GameMaker fajn. Ale rozumím ti, nemám rád takové ty rádoby profi 3d hry. Buď ať je to profi nebo ať je to brané s nadsázkou, třeba jako to retro.

Odpovědět  +2 9.11.2012 14:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na David Čápka
TomBen:

Máš pravdu, 3D hra určitě nemusí kopírovat realitu a retro hry
mají své kouzlo. ( já mám třeba hodně rád Arenu: The Daggerfall )
Ale je asi docela rozdíl, jestli třeba měkké stíny nepoužiješ
protože je nechceš použít a nebo proto, že je nemáš k dispozici.
Navíc je slušné 3D trochu těžké na chápání a určitě jde jiným
směrem než 2D ikonová algoritmizace v Game Makeru. Myslím, že
yoyogames udělali velkou chybu, když věnovali čas rozvoji 3D místo
aby dovedli k dokonalosti normální 2D. Věděl bych o dost věcech,
které tam tak nějak nejsou. ;)

Odpovědět 10.11.2012 15:05
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Kwatar
Člen
Avatar
Kwatar:

CS lidi, nevíte jak udělat v GM 3D object. Vysvětlím Vám raději celý ten nápad aby jste mne pochopili. Byla by hra ve které koukáte ze zhora ale s mírným úhlem asi tak 20°-40° a dole by byl napřiklad voják který je vytvarovaný skoro jako skutečný člověk. Vím že to asi možná nepůjde, ale rád si vyslechnu všechny vaše názory.

Odpovědět 26.7.2013 9:37
Not found.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Kwatar
TomBen:

Předrenderuj si to. Bude to hezčí.
Jinak pokud v GM nemáš hotovo mnoho skvělých 2D her,
tak se do 3D nepouštěj vůbec. GM na to není stavěný.

Odpovědět 26.7.2013 15:20
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Odpovídá na Kwatar
Neaktivní uživatel:

sam sice GM neovladam nejlip ale delal bych to takto

naucit se vsechny tlacitka

pote GML (Game Maker Language)

a az pote 3D hry v GM ale jestli ti jde opravdu moc o 3D hry tak se vykasli na GM a jdi se ucit treba Unity3D (nedavno zacali delat tutorialy)

Odpovědět 26.7.2013 16:59
Neaktivní uživatelský účet
Avatar
david.petrik
Člen
Avatar
david.petrik:

Jak můžu nastavit, aby pohled byl ovládán myší?

 
Odpovědět 31.5.2014 19:38
Avatar
jurka.stejskal:

Jak mám udělat válce?

 
Odpovědět 30.6.2014 11:51
Avatar
Šimon Raichl
Redaktor
Avatar
Odpovídá na David Čápka
Šimon Raichl:

Já sice né zrovna Wolfenstein, protože mi připadá méně hratelný než Doom, ale jinak se mi 3D dosovky taky líbí.

 
Odpovědět 15.8.2014 22:57
Avatar
qik9
Člen
Avatar
Odpovídá na david.petrik
qik9:

Pokud ti stačí jen "doleva, do prava" tak jednoduše do objektu o_player do Eventu Draw do kódu přidáš následující:

direction -= (display_mouse_get_x() -(display_get_wid­th()/2)) /5;
display_mouse_set(dis­play_get_width()/2, display_get_he­ight()/2);

S hodnotama si můžeš samozřejmě pohrát - záleží jakou potřebuješ rychlost atd.

Zkus nyní sám popřemýšlet jak přidáš ovládání nahoru a dolů. Pokud si s tím nebudeš vědět rady, rád ti pomůžu tě navést.. ale pokud by jsem ti to tu všechno vypsal, neměl by jsi z výsledku radost, neb by to nebyla "tvá práce" ale jen práce někoho jiného.

 
Odpovědět 2.5.2015 11:14
Avatar
Odpovídá na David Čápka
Garrom Orc Shaman:

Když o tom mluvíme tak jsme na tom stejně, já také rád hraji staré hry (často nazývané "Dosovky")...asi nejradši mám zmíněného Wolfensteina déle Doom1 a 2 a samozřejmě takové ty ikony jako jsou DukeNukem3d, Blood nebo TES II Daggerfall, s trochou fantasie takovouto hru naprogramuješ za den (mám na mysli použitelný základ tj. kamera, pohyb, zdi, strop, podlaha) a jak si to vyšperkuješ je jen na tobě ;-)

Odpovědět 21. března 12:49
We're orcs, maybe we are not always wise or beautiful, but we will always be strong, outnumbered and well armed
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 14. Zobrazit vše