NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

Tutoriál na tvorbu 3D stříleček 2 - Převod do 3D

(Napsal Mark Overmars - (C) YoYo Games Ltd, pro devbook.cz přeložil sdraco)

Toto je pravděpodobně nejdůležitější část. Zde totiž přeměníme naši nudnou 2D hru na o mnoho lépe vypadající (ale zatím stále nudnou) trojrozměrnou hru.

Náš objekt player se stane tím nejdůležitějším objektem. V jeho Create události inicializujeme 3D mód pomocí následujícího kusu kódu:

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

První řádek nastartuje 3D mód. Druhý vypne vykreslování povrchu, který není vidět. To znamena, že objekty, které leží za jinými objekty, nebudou vidět. Toto je v 3D hrách běžné. Další řádek říká, že nebudeme používat zdroje světla. Další řádek vypne culling. To je o něco komplikovanější k pochopení. Když vykreslujeme polygon (mnohoúhelník) v prostoru, má 2 strany. Když je culling zapnutý, vykreslí se pouze jedna strana (definovaná pořadím vrcholů). Když se to používá opatrně, šetří se kreslící čas. Ale naše zdi budou viditelné z obou stran, takže to není to, co chceme. (V podstatě není potřeba žádná z těchto řádek, protože je to výchozí nastavení, ale přidali jsme je sem, abyste pochopili jejich význam.) Nakonec nastavíme interpolaci textur. Ta zajistí, že textury vypadají z blízka lépe. (Můžete to také nastavit v Global game settings).

Abychom si byli jistí, že se události v objektu player vykonají dříve, než v jiných objektech, dáme mu depth 100 (měli byste si pamatovat, že s objekty je pracováno podle snižující se depth). Také vymažeme End step událost, kterou jsme přidali v naši 3D verzi k zjištění směru. Už to totiž nebudeme potřebovat a mohlo by to přinést akorát problémy.

Dalším krokem je, aby zdi vypadaly dobře a byly správně vykresleny. Za tímto účelem budeme potřebovat nějaké textury. Některé z nich vytvořil David Gurrea a můžete je najít na http://www.davegh.com/vg/walls.htm . (Prosím, přečtěte si zde podmínky užití. Kvůli nim nejsou textury obsaženy v tomto tutoriálu. Měli byste si je stáhnout sami.). Všechny je zmenšíme na velikost 128x128. Je velmi důležité, aby velikost textur byla mocnina 2 (např. 64x64, 128x128, 256x256), jinak nebudou lícovat. Zde jsou textury zdi, stropu a podlahy, které jsme v tutoriálu použili:

Textury zdí, stropů a podlahy - GameMaker - 3D hry

Přidáme tyto obrázky jako background. Aby každý objekt zdi zeď opravdu vykresloval s touto texturou z pozadí, potřebujeme znát souřadnice. Ty nastavíme v Create události pro každý objekt zdi (protože budou pro každý jiné). Napřiklad pro horizontální zeď vložíme do Create následující kód:

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

Poslední řádek potřebuje trochu vysvětlit. Funkce background_get_tex­ture() vrací index textury podle zvoleného background. Použijeme to později, abychom dostali texturu k vykreslení zdi. Podobný kus kódu vložíme do Create událostí všech objektů zdí.

Samotné vykreslení zdi proběhne v události Draw objektu obj_wall_basic. Zde přidáme akci Code s následujícím obsahem:

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

To vykreslí zeď podle hodnot, které jsme nastavili v Create event. Poslední 2 parametry nastavují, aby se textura opakovala pouze jednou v obou směrech, takže pokryje celou zeď. Opakování textur může být použito na velké plochy.

Jsme téměr hotoví. Stále potřebujeme naprogramovat, jak se budeme na svět dívat a také vykreslit strop a podlahu místností. To uděláme v události Draw objektu player. Tento objekt bude odteď hrát roli kamery a pohybovat se ve světě. Vložíme sem akci Execute code s následujícím obsahem:

{
  // set the projection
  d3d_set_projection(x,y,10, x+cos(direction*pi/180),
                             y-sin(direction*pi/180),10, 0,0,1);
  // set color and transparency
  draw_set_alpha(1);
draw_set_color(c_white);
  // draw floor and ceiling
  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);
}

Jsou zde 3 části. V první se nastaví projekce, přes kterou se budeme na místnost dívat. Funkce d3d_set_projec­tion() vyžaduje jako první 3 parametry bod, ze kterého se díváme, další 3 parametry bod, na který se díváme a poslední 3 parametry jsou stoupající směr (může být použit k otáčení kamery). Díváme se z pozice (x, y, 10), to je pozice kamery, ale trochu výše do vzduchu. Bod, na který se díváme, vypadá trochu komplikovaně, ale ve skutečnosti je to jednoduše bod, který je jedno políčko před námi. Nakonec nastavíme, že stoupající směr je směr z (0, 0, 1).

Druhá část jednoduše nastaví alpha na 1, což znamená, že jsou všechny neprůhledné. Také nastaví barvu na white. To je důležité. Textury jsou obarvovány aktuální barvou. To je užitečná vlastnost (můžete např. vykreslit červený strop nastavením červené barvy před vykreslením stropu). Ale většinu času budete obarvovat jen bílou barvou. (Výchozí barva v Game Makeru je černá, takže pokud ji nezměníte, celý svět bude černý).

V třetí části vykreslujeme podlahu a strop (ve výšce 32) s použitím správných textur. Jak vidíte, nastavili jsme, aby se textura několikrát opakovala místo toho, aby se roztáhla přes celý strop.

A to je vše. Hru naleznete v souboru fps1.gmk níže ke stažení. Můžete si ji spustit a projít se ve světě. Náhle naše hra vypadá úplně jinak, i když je vlastně stále dvourozměrná. Pouze grafika vypadá 3D. Hra by měla vypadat nějak takhle:

První 3D hra v Game Makeru - GameMaker - 3D hry

 

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 1014x (83.05 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

Všechny články v sekci
GameMaker - 3D hry
Článek pro vás napsal David Hartinger
Avatar
Uživatelské hodnocení:
2 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity