IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Tutoriál na tvorbu 3D stříleček 4 - Objekty a sprity

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

Náš svět je stále spíše prázdný. Jsou tam jen nějaké zdi. V této části do něj vložíme nějaké objekty. Jsou spíše na okrasu, ale hráč (a protivníci) se za ně mohou schovat. Obecně řečeno, jsou 2 způsoby, jak vložit objekt do světa. První je vytvořit trojrozměrný objekt z trojúhelníků, na kterém je namapovaná textura. Dosáhneme nejhezčího efektu, ale takový objekt trvá dlouho vytvořit i vykreslit. Namísto toho jednoduše použijeme sprity, které budou v našem světě reprezentovat objekty. Tuto techniku použijeme pro vše: kulky, rostliny, zbraně, exploze atd. Věci jsou však více komplikované, než se zdají. Všechny sprity jsou ploché, když se na ně podíváme z nesprávného úhlu, nebudou vidět. Toto vyřešíme tak, že sprity necháme, aby se natáčely vždy k hráči.

Používáme sprity

Jako příklad si vytvoříme objekt rostlinu, kterou můžeme rozmístit do místností, aby vypadaly více zajímavé. Jako u hráče a u segmentů zdí, použijeme velmi jednoduchý sprite, který bude rostlinu v místnosti reprezentovat. Je to jednoduché pro návrh místnosti a také toho využijeme při kolizi, ale hráč nemohl rostlinou projít. Vytvoříme se objekt rostlina a jako parrent jí dáme opět basic wall. Tak se bude rostlina pro hráče a i pro kulky chovat jako zeď. Přepíšeme událost Draw, protože potřebujeme vykreslovat něco jiného, než zeď. Pro vykreslení rostliny potřebujeme pěkný sprite. Tento sprite bude částečně průhledný a aby vypadal ještě lépe, zaškrtneme možnost smooth edges. V události Draw využijeme sprite k tomu, abychom rostlinu vykreslili na vertikální zeď (použijeme funkci pro kreslení zdí). Protože sprite je částečně průhledný, uvidíte jen určitou část zdi.

Je tu jeden konkrétní problém. Sprite je plochý obrázek. Kdybyste se na něj podívali ze strany, stane se najednou velmi tenkým a skoro zmizí. Abychom tomu zabránili, můžeme použít jednoduchý trik, který využívá i mnoho dalších her. Budeme sprite stále natáčet na kameru. Takže sprite bude vypadat stále stejně, ať se budete dívat kamkoli. Vlastně rotuje s vámi. I když to může znít nepřirozeně, tento efekt je docela pěkný. Jak toho docílíme? Potřebujeme trochu aritmetiky. Následující obrázek znázorňuje situaci. Šipka znázorňuje směr, kterým se hráč dívá, je označen jako D. Černý obdélník reprezentuje sprite. Když bude mít sprite délku 2L, pozice dvou rohů je:

Natáčení spritu ve 3D - GameMaker - 3D hry

Následující kus kódu vložíme do Draw události pro objekt rostlina:

{
  var ss,cc,tex;
  tex = sprite_get_texture(spr_plant,0);
  ss = sin(obj_player.direction*pi/180);
  cc = cos(obj_player.direction*pi/180);
  d3d_draw_wall(x-7*ss,y-7*cc,20,x+7*ss,y+7*cc,0,tex,1,1);
}

V kódu vybereme správnou texturu a spočítáme 2 hodnoty, uvedené výše. Potom vykreslíme sprite na zeď 14x20, která stojí na podlaze a natáčí se s hráčem. Velikost a pozice jistě závisí na objektu, který vykreslujeme.

Pokud je více spritů, které mají být tímto způsobem vykresleny, je jednodušší si uložit hodnoty sinu a kosinu do globální proměnné, kterou bude objekt player updatovat, než je počítat stále znovu pro každý sprite. Tímto způsobem to uděláme ve hře, kterou vytváříme. V události End step objektu player si uložíme obě hodnoty do globálních proměnných camsin a camcos.

Je tu jedna důležitá komplikace. Protože hrany spritu jsou částečně průhledné (kvůli nastavení smooth edges), musíme být opatrní s pořadím, ve kterém jsou objekty vykreslovány. Částečně průhledné sprity se prolínají jen s objekty, které byly vykresleny dříve. Abychom dosáhli požadovaného efektu, sprity s alpha blendingem musíme vykreslovat po vykreslení všech ostatních objektů. Toho snadno dosáhneme nastavením záporné depth objektu rostlina. Výsledek přidání květin vypadá nějak takto:

Přidání objektu rostlina do 3D místnosti - GameMaker - 3D hry

Tímto způsobem můžeme vytvořit mnoho dalších objektů, které si můžete do místností vložit. (Ale nepřežeňte to, zpomaluje to hru a kazí herní zážitek.)

Animované objekty

Objekty můžeme také podobným způsobem animovat. Musíme však zajistit 2 věci. Jako první potřebujeme sprite, který obsahuje několik podobrázků pro animaci. Musíme se ujistit, že sprite, který používáme k znázornění objektu v roomu má stejný počet podobrázků, jinak bychom nemohli použít vestavěnou proměnnou image_index. Zde je typický kus kódu, který by mohl být využit pro vykreslení objektu exploze. Jak je vidět, také používá nastavení alfaprůhlednosti.

{
  var ss,cc,tex;
  tex = sprite_get_texture(spr_explosion,image_index);
  ss = sin(obj_player.direction*pi/180);
  cc = cos(obj_player.direction*pi/180);
  draw_set_alpha(0.7);
  draw_set_color(c_white);
  d3d_draw_wall(x-8*ss,y-8*cc,2,x+8*ss,y+8*cc,18,ttt,1,1);
  draw_set_alpha(1);
}

Hru, kterou jsme si vytvořili, naleznete níže v souboru fps3.gmk.


 

Stáhnout

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

Staženo 423x (324.7 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í:
3 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