Pravidla Ucet
Nepřihlášen

Článek

Menu

First Person Shooter - 1. část
Napsal: Satik64
Přidáno: 24.07. 2010

První díl seriálu z tutoriálu Marka Overmarse o tvorbě jednoduché first person střílečky pomocí GM3D

First Person střílečka

V tomto seriálu si postupně vytvoříme jednoduchou first person střílečku (střílečka z první osoby) V GM3D. Jde o tutoriál napsaný Markem Overmarsem, já ho budu jenom překládat.


Napsal Mark Overmars
Copyright © 2007-2009 YoYo Games Ltd
Použití: Game Maker 8.0, Pro Edition, Advanced Mode
Úroveň: Pokročilý


V tomto tutoriálu prozkoumáme 3D vykreslovací funkce v Game Makeru. „Ale já myslel, že Game Maker je pro dvourozměrné hry?“ můžete se zeptat. Ano, je určen pro 2D hry. Ale jsou tu i funkce pro 3D grafiku. V tomto tutoriálu vytvoříme first person střílečku. I když všechna grafika bude vypadat trojrozměrně, celá hra je umístěná v dvourozměrném světě. Takže použijeme standardní mechanismus Game Makeru k vytvoření této 2-rozměrné hry, ale spíše než vykreslování dvourozměrného roomu budeme tvořit trojrozměrnou grafiku. Uvidíte, že to není příliš těžké. Ale potřebujete docela dobře rozumět GML, a nesmíte se bát psaní některých kusů kodu. Proto je tento tutoriál určen pro pokročilé uživatele. A nezapomeňte, že 3D grafické funkce jsou dostupné pouze v Pro Edici Game Makeru.

 

Budeme vytvářet hru v jednotlivých krocích, začneme s 2D verzí a do ní přidáme 3D grafiku.

   

Dvourozměrná hra

Jak je uvedeno výše, nynější podoba first person střílečky bude 2D. Takže první vytvoříme dvourozměrnou hru, kterou později převedeme do 3D grafiky. Protože grafika není v této fázi důležitá, nebudeme potřebovat pěkné sprity. Všechny objekty (postava, nepřátelé, střely, atd.) budou zobrazeny jednoduchými barevnými kruhy. Zdi budou zobrazeny vodorovnými nebo svislými bloky. V této části uděláme jednoduchou dvojrozměrnou scénu s roomy a hlavní postavou. Ostatní body budou přidány později. Hru můžete najít v souboru fps0.gmk dole.

 

Vytvoříme 2 typy zdí: jedna horizontální a jedna vertikální. Také vytvoříme jeden základní objekt zdi, nazvaný obj_wall_basic. Tento objekt se stane parentem všech ostatních zdí (později vytvoříme vice). To umožní mnohem snazší detekce kolizí a vykreslování. Objekty s tímto parentem nemusí mít akce. Všechny budou pevné. Takže horizontální pevné zdi budou vypadat nějak takto:

 
  Takže je to celkem nuda. Jen jeden sprit a objekt vyplní parent.  

Další objekt, který musíme vytvořit, je postava. Tu znázorníme malým modrým kruhem. Na jednu stranu mu dáme červenou tečku, abychom viděli směr kterým se pohybuje. To je důležité pouze v 2D verzi, v 3D verzi je to nepodstatné. Do End Stepu přidáme akci Set Variable ve které nastavíme proměnnou image_angle na direction, čím dáme červenou tečku do správného směru. Teď už zbývá jen pohyb. K získání plynulého pohybu nepoužijeme náhlý start. To by vypadalo v 3D verzi dost špatně. Proto budeme začátek a konec pohybu stupňovat. Za tímto účelem vložíme do eventu Keyboard <Up> akci Execute Code s následujícím kodem:

{
if ( speed < 2 ) speed = min (2,speed+0.4);
}

Takže budeme postupně získávat rychlost než dosáhneme maxima z 2. V eventu Keyboard <Down> uděláme to samé ale opačně. V <Left> a <Right> eventu Keyboard jednoduše snížíme nebo zvýšíme směr pohybu. V Create eventu nastavíme friction na 0.2, takže se po uvolnění klávesy <Up> rychlost opět sníží. (můžete si trochu pohrát s maximální rychlostí, rychlostí zvýšení a friction k získání účinku jaký chcete.) Nakonec v Collision eventu s objektem obj_wall_basic zastavíme pohyb (je to trochu špatně, později si ukážeme jak to zdokonalit). Protože všechny objekty zdí mají parent obj_wall_basic, můžeme definovat jenom jednu kolizi.

 

Nakonec potřebujeme vytvořit level s různými oblastmi. Pečlivý design levelů je důležitý k vytvoření zajímavého hraní. Zatím se omezíme na podivně vypadající room níže.

 
  V příkladu fps0.gmk (ke stažení pod článkem) si s tím můžete pohrát.    

Proměna do 3D hry

Toto je asi nejdůležitější část. Tady budeme přeměňovat naši nudnou 2D hru na mnohem lépe vypadající (ale ještě stále nudnou) trojrozměrnou hru.

 

Náš objekt postavy se stává nejdůležitějším objektem. V jeho eventu Create inicializujeme 3D mod použitím následujícího kodu:

 
{
d3d_start();
d3d_set_hidden(true);
d3d_set_lighting(false);
d3d_set_culling(false);
texture_set_interpolation(true);
}
 

První řádek spouští 3D mod. Druhý řádek určuje že je zapnuto odstranění skrytého povrchu. To znamená, že objekty, které leží za ostatními, nejsou vidět. Další řádek určuje, že nebudeme používat zdroje světla. Pátý řádek určuje culling. Ten je trochu složitý k pochopení. Při vykreslování polygonu v prostoru má polygon 2 strany. Pokud je culling zapnutý, vykresluje se pouze jedna strana (definována pořadím verticlů). To šetří vykreslovací čas, když se správně použije. Ale naše zdi budou vidět z obou stran, takže to nemůžeme použít. (Vlastně tyto tři řádky nejsou potřebné, protože jsou defaultně nastavené, ale pro pochopení jejich významu je uvedeme) Nakonec nastavíme interpolaci textur. To dělá pohled na textury hezčí, když se k nim dostaneme blíž. (lze nastavit v Global Game Settings.)

 

Abychom se ujistili, že eventy v kontrolním objektu jsou prováděny před ostatními v jiných objektech, dáme depth na 100 (měli byste pamatovat, že objekty jsou vyřizovány v sestupném pořadí). Také odstraníme End Step, přidaný v naší 2D verzi hry, k indikaci směru. To už nebudeme potřeboval a vlastně by to později vedlo k problémům.

 

Další věc kterou uděláme, je proměnění stěn v krásně vypadající a vykreslující ve správné cestě. K tomuto účelu budeme potřeboval nějaké textury. V tomto tutorialu budeme používat mnoho textur, některé z nich vytvořil David Gurrea, kterého můžete najít na webu http://www.davegh.com/blade/davegh.htm. (přečtěte si prosím podmínky použití. Textury nejsou součástí tohoto tutorialu. Musíte je stáhnout sami.) Snížíme je všechny na velikost 128x128. To je velmi důležité, aby velikost textur byla násobkem 2 (např. 64, 128, 256). jinak nebudou pěkně sedět. Tady jsou textury zdi, podlahy a stropu, které použijeme:

 
 

Přidáme tyto tři obrázky jako pozadí do hry. Necháme každý objekt vykreslit zeď s tímto pozadím textury, potřebujeme znát v jakých souřadnicích má zeď být. To nastavíme v eventu Create každé jednotlivé zdi (protože bude každá jiná). Například, vodorovná zeď bude mít v Create eventu následující kod:

{
x1 = x-16;
x2 = x+16;
y1 = y;
y2 = y;
z1 = 32;
z2 = 0;
tex = background_get_texture(texture_wall);
}

Poslední řádek vyžaduje vysvětlení. Funkce background_get_texture() vrací index textury odpovídající uvedenému pozadí. To budeme potřebovat později, kdy použijeme texturu na zeď. Vložíme podobný kod v Create eventu do ostatních objektů zdí.   Teď vykreslíme zeď v Draw eventu objektu obj_wall_basic. Vložíme akci Code Action s následujícím kodem:

{
d3d_draw_wall(x1,y1,z1,x2,y2,z2,tex,1,1)
}

To vykreslí zeď, s použitím hodnot které jsme nastavili v Create eventu. Poslední 2 parametry určují, že se textura musí opakovat jen jednou v obou směrech. Opakující se textury můžou být použitý pro výplň velkých oblastí.   Máme téměř hotovo. Potřebujeme ještě určit jak má vypadat ve světě, a musíme vykreslit strop a podlahu roomu. To uděláme v Draw eventu postavy. Hráč odteď bude sloužit jako hlavní kamera pohybující se po světě. Vložíme akci Execute Code s následujícím kodem:

 
{
//nastaví projekci
d3d_set_projection(x,y,10,x+cos(direction*pi/180),y-sin(direction*pi/180),10,0,0,1);
//nastavení barvy a průhlednosti
draw_set_alpha(1);
draw_set_color(c_white);
//vykreslení podlahy a stropu
d3d_draw_floor(0,0,0,640,480,0,background_get_texture(texture_floor),24,18);
d3d_draw_floor(0,0,32,640,480,32,background_get_texture(texture_ceiling),16,12);
}
 

Vidíme 3 části. V první části nastavíme projekci, pomocí které se budeme v roomu dívat. Funkce d3d_set_projection() bere jako první tři parametry body, od kterých budeme vidět, další 3 parametry kterým se díváme směrem, a poslední 3 směr nahoru (může být použito pro zkroucení kamery). Budeme se dívat z pozice (x,y,10), to znamená, že kamera bude pozice hráče, ale bude trochu výš ve vzduchu. Bod, kterým se díváme, vypadá mnohem složitěji, ale je to jednoduše bod ležící jeden krok ve směru postavy. Poslední určuje, že horní směr kamery je směr z.

 

Druhá část jednoduše nastavuje průhlednost na 1 platící pro všechny solidní objekty.Také nastavuje barvu na bílou. To je důležité. Textury jsou míchány s aktuální barvou. To je užitečná vlastnost (můžete například udělat červenou podlahu nastavením vykreslovací barvy na červenou, před vykreslením podlahy). Ale nejvíc budete potřebovat bílou barvu. (původní vykreslovací barvy v Game Makeru je černá, pokud ji nezměníte, svět bude vypadat černě.)

 

Třetí část vykresluje podlahu a strop (ve výšce 32) použitím správných textur. Jak vidíte, textury se musí mnohokrát opakovat, než abychom je zvětšili na celou plochu.   To je vše. Aktuální stav hry najdete v souboru fps1.gmk. Můžete teď spustit hru a chodit ve vašem světě. Najednou naše hra vypadá úplně jinak, ikdyž je ve skutečnosti stejná jako naše 2D hra. Pouze grafika se proměnila v 3D. Hra by měla vypadat nějak takto:

 
 

V příštím díle si ukážeme jak přidat mlhu, objeky a zlepšíme hratelnost.

Přiklad první části (2D) je ke stažení tady
Přiklad druhé části (3D) je ke stažení tady

Ostatní díly seriálu:
[24.07. 2010] - First Person Shooter - 4. část
[24.07. 2010] - First Person Shooter - 3. část
[24.07. 2010] - First Person Shooter - 2. část
Klíčová slova: first person shooter fps 3D GM3D
 

Komentáře:

Napsal: Kešu
Přidáno: 27.01. 2011

d3d_set_projection se dá udělat ještě jedním způsobem :

d3d_set_projection(x,y,10,x+lengthdir_x(10,direction),y+lengthdir_y(10,direction),10,0,0,1);

Trvalý odkaz

Napsal: Satik64
Přidáno: 25.07. 2010

Je to rozdělené, část není ještě přeložená a tu přeloženou vždycky ještě jednou přejedu aby dávala větší smysl :)

Trvalý odkaz

Napsal: jackm
Přidáno: 25.07. 2010

Hmmm, ono stačí dát uložit cíl jako.

Jinak moc pěkný(je to těch celejch 20 stran, nebo to rozdělíš na části?), ale pro mně je lehčí Ultimate 3D. :D

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 25.07. 2010

Hmmm, to by bylo nejlepší, protože to furt stahovat přez externího down. manažera se mi fakt nechce :)

Trvalý odkaz

Napsal: Satik64
Přidáno: 24.07. 2010

V opeře taky bez problémů... Příště je ale budu balit do raru

Trvalý odkaz

Napsal: Manual
Přidáno: 24.07. 2010

JJ taky mi to blbne

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 24.07. 2010

Já mám Google Chrom a vše mi funguje výborně... :D Tutoriál je dobrej.... ;)

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 24.07. 2010

Sakra taky vám firefox furt otvírá GMK jako texťák přímo v okně, místo, aby ho stáhnul? :-/

Trvalý odkaz

Napsal: Kešu
Přidáno: 24.07. 2010

Skvělý! Mockrát díky!

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010