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

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

(Napsal Mark Overmars - (C) YoYo Games Ltd, pro devbook.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

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

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ženo 408x (324.7 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

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


 



 

 

Komentáře

Avatar
marek427
Neregistrovaný
Avatar
marek427:

Prosím ako mám urobiť aby som sa otáčal pomocou myši dohora,dola,do­lava,doprava.­...nwm ako to mám urobit teda aký kod....prosím poradte

 
Odpovědět 5.1.2013 16:18
Avatar
Odpovídá na marek427
Neaktivní uživatel:

máš to v komentech u posledního partu série tutoriálů

GoodLuck,Dude ;)

Odpovědět 13.6.2015 14:31
Neaktivní uživatelský účet
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 2 zpráv z 2.