Tutoriál na tvorbu 3D strieľačiek 4 - Objekty a sprity
(Napísal Mark Overmars - (C) YoYo Games Ltd, pre itnetwork.cz preložil sdraco)
Náš svet je stále skôr prázdny. Sú tam len nejaké múru. V tejto časti do neho vložíme nejaké objekty. Sú skôr na okrasu, ale hráč (a protivníci) sa za ne môžu schovať. Všeobecne povedané, sú 2 spôsoby, ako vložiť objekt do sveta. Prvý je vytvoriť trojrozmerný objekt z trojuholníkov, na ktorom je namapovaná textúra. Dosiahneme najkrajšieho efektu, ale taký objekt trvá dlho vytvoriť i vykresliť. Namiesto toho jednoducho použijeme sprity, ktoré budú v našom svete reprezentovať objekty. Túto techniku použijeme pre všetko: guľky, rastliny, zbrane, explózie atď. Veci sú však viac komplikované, ako sa zdajú. Všetky sprity sú ploché, keď sa na ne pozrieme z nesprávneho uhla, nebudú vidieť. Toto vyriešime tak, že sprity necháme, aby sa natáčali vždy k hráčovi.
Používame sprity
Ako príklad si vytvoríme objekt rastlinu, ktorú môžeme rozmiestniť do miestností, aby vyzerali viac zaujímavé. Ako u hráča au segmentov múrov, použijeme veľmi jednoduchý sprite, ktorý bude rastlinu v miestnosti reprezentovať. Je to jednoduché pre návrh miestnosti a tiež toho využijeme pri kolízii, ale hráč nemohol rastlinou prejsť. Vytvoríme sa objekt rastlina a ako parrent jej dáme opäť basic wall. Tak sa bude rastlina pre hráčov a aj pre guľky správať ako múr. Prepíšeme udalosť Draw, pretože potrebujeme vykresľovať niečo iné, než múr. Pre vykreslenie rastliny potrebujeme pekný sprite. Tento sprite bude čiastočne priehľadný a aby vyzeral ešte lepšie, zaškrtneme možnosť smooth edges. V udalosti Draw využijeme sprite k tomu, aby sme rastlinu vykreslili na vertikálny stenu (použijeme funkciu pre kreslenie múrov). Pretože sprite je čiastočne priehľadný, uvidíte len určitú časť múru.
Je tu jeden konkrétny problém. Sprite je plochý obrázok. Keby ste sa na neho pozreli zo strany, stane sa zrazu veľmi tenkým a skoro zmizne. Aby sme tomu zabránili, môžeme použiť jednoduchý trik, ktorý využíva aj mnoho ďalších hier. Budeme sprite stále natáčať na kameru. Takže sprite bude vyzerať stále rovnako, či sa budete pozerať kamkoľvek. Vlastne rotuje s vami. Aj keď to môže znieť neprirodzene, tento efekt je celkom pekný. Ako to docielime? Potrebujeme trochu aritmetiky. Nasledujúci obrázok znázorňuje situáciu. Šípka znázorňuje smer, ktorým sa hráč pozerá, je označený ako D. Čierny obdĺžnik reprezentuje sprite. Keď bude mať sprite dĺžku 2L, pozícia dvoch rohov je:
Nasledujúce kus kódu vložíme do Draw udalosti pre objekt rastlina:
{ 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óde vyberieme správnu textúru a spočítame 2 hodnoty, uvedené vyššie. Potom vykreslíme sprite na stenu 14x20, ktorá stojí na podlahe a natáča sa s hráčom. Veľkosť a pozície iste závisí na objekte, ktorý vykresľuje.
Ak je viac sprites, ktoré majú byť týmto spôsobom vykreslené, je jednoduchšie si uložiť hodnoty sínusu a kosínusu do globálnej premennej, ktorú bude objekt player updatovať, než je počítať stále znovu pre každý sprite. Týmto spôsobom to urobíme v hre, ktorú vytvárame. V udalosti End step objektu player si uložíme obe hodnoty do globálnych premenných camsin a camcos.
Je tu jedna dôležitá komplikácie. Pretože hrany Spritu sú čiastočne priehľadné (kvôli nastaveniu smooth edges), musíme byť opatrní s poradím, v ktorom sú objekty vykresľované. Čiastočne priehľadné sprity sa prelínajú len s objektmi, ktoré boli vykreslené skôr. Aby sme dosiahli požadovaný efekt, sprity s alpha blending musíme vykresľovať po vykreslenie všetkých ostatných objektov. Toho ľahko dosiahneme nastavením zápornej depth objektu rastlina. Výsledok pridanie kvetín vyzerá nejako takto:
Týmto spôsobom môžeme vytvoriť mnoho ďalších objektov, ktoré si môžete do miestností vložiť. (Ale neprežeňte to, spomaľuje to hru a kazia herný zážitok.)
Animované objekty
Objekty môžeme tiež podobným spôsobom animovať. Musíme však zabezpečiť 2 veci. Ako prvý potrebujeme sprite, ktorý obsahuje niekoľko podobrázků pre animáciu. Musíme sa uistiť, že sprite, ktorý používame na znázornenie objektu v roomu má rovnaký počet podobrázků, inak by sme nemohli použiť vstavanú premennú image_index. Tu je typický kus kódu, ktorý by mohol byť využitý pre vykreslenie objektu explózie. Ako je vidieť, tiež používa nastavenie 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, ktorú sme si vytvorili, nájdete nižšie v súbore fps3.gmk.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 424x (324.7 kB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker