IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Tutoriál na tvorbu 3D strieľačiek 5 - strieľate na barely

(Napísal Mark Overmars - (C) YoYo Games Ltd, pre itnetwork.cz preložil sdraco)

Pretože naša hra bola zamýšľaná ako strieľačka, mali by sme radšej pridať možnosť strieľať. V tejto časti budeme strieľať len do barelov, ktoré si do herného sveta umiestnime. V ďalšej časti potom pridáme príšery.

Pridanie barelov

Pre strieľanie barelov potrebujeme obrázok barelu. Vlastne potrebujeme 2, jeden keď barel v pokoji stojí a druhý, keď exploduje. Požičiame si nejaké obrázky z hry Doom. Nájdeme ich na http://www.cslab.ece.ntua.gr/~phib/doom1.htm. Oba sprity sú animované. Pre ich znázornenie v miestnosti tiež potrebujeme 2 sprity. Pre správnu animáciu je nutné, aby mali rovnaký počet podobrázků. Vytvoríme si objekty barel a explodujúcej barel. Oboch dáme ako parrent basic wall, aby sme nimi nemohli prechádzať. Objekt barel vložíme do miestnosti na rôzne miesta. Pretože má iba 2 podobrázky, nastavíme v udalosti Create premennú image_speed na 0.1, čím animáciu spomalíme. V udalosti Draw vykreslíme príslušný podobrázek tak, ako sme to robili vyššie.

Keď je barel zničený (teda v udalosť Destroy), vytvoríme na jeho mieste objekt explodujúcej barel. Aj pre tento objekt nastavíme nižšiu rýchlosť animácie. Keď je barel zničený (teda v udalosť Destroy), vytvoríme na jeho mieste objekt explodujúcej barel. Aj pre tento objekt nastavíme nižšiu rýchlosť animácie. Pretože barel neexploduje okamžite, použijeme alarm, aby bol zvuk explózie počuť až po krátkej chvíľke. K vykreslenie použijeme opäť rovnaký spôsob, ako vyššie, ale s jedným trikom. Pomaly znižujeme alfa priehľadnosť, takže sa explózie sprehľadňuje. Do Draw udalosti vložíme:

draw_set_alpha(1-0.05*image_index);

Nakoniec v udalosti Animation end barel zničíme. Hru nájdete v súbore fps4.gmk.

Ľahko by ste mohli pridať ďalšie extra vlastnosti, napr. Že barely blízkosti explodujúceho barelu tiež explodujú alebo že explózia zraní hráča, ak je v blízkosti. V našej jednoduchej hre sme tieto veci neimplementovali.

Pištole

Pre pištoľ opäť použijeme animovaný sprite. Sprite má podobrázky pre pištoľ v pokoji (podobrázek 0) a pre strieľanie a nabíjanie. Normálne vykresľujú len podobrázek 0 (preto nastavíme image_speed na 0), ale pri výstrele musíme prejsť celú animácií. Chceme, aby sa pištoľ vykreslovala cez herné scénu. Aby sme to dosiahli, musíme zabezpečiť niekoľko vecí. Po prvé sa objekt pištoľ musí vykresliť ako posledný. To zabezpečíme nastavením jeho depth na 100. Po druhé už nemôžeme používať perspektívny projekciu, ale zmeniť ju na normálnu orthografickou. Ako posledný musíme dočasne prepnúť hidden surface removal (vykresľovanie skrytých plôch). Kód pre udalosť Draw objektu pištole bude vyzerať takto:

{
  d3d_set_projection_ortho(0,0,640,480,0);
  d3d_set_hidden(false);
  draw_sprite_ext(sprite_shotgun,-1,0,224,2,2,0,c_white,1);
  d3d_set_hidden(true);
}

Všimnite si, že obrázok roztiahneme s faktorom 2 v oboch smeroch. Inak je príliš malý. V ďalšom kroku udalosť Draw nastaví projekciu späť na perspective, nepotrebujeme ju tu nastavovať späť.

Podobnú techniku môžete použiť na vykreslenie všetkých ďalších potrebných vecí cez herné scénu. Nižšie ju tiež použijeme na zobrazenie života hráča, môžete napríklad zobrazovať inštrukcie, štatistiky atď. Tiež môžete vykresľovať informácie transparentne nastavením alfa hodnoty pred samotným vykreslením.

Streľba

Teraz máme barel k zostrelenie a pištoľ, ale stále nemáme implementovaný Strilic mechanizmus. Pretože máme brokovnicu, guľky (tu broky) sú veľmi rýchle. Tvoriť objekty nábojov teda nie je riešením. Namiesto toho musíme v momente stlačenia klávesy <Space> zistiť, na ktorý objekt sa strieľa a ak je to barel, necháme ho explodovať.

Ako prvý si uvedieme premennú can_shoot v objekte pištole, ktorá indikuje, či hráč môže strieľať. Nastavíme ju na true v udalosti Create objekte pištole. Keď hráč stlačí kláves <Space>, skontrolujeme premennú. Pokiaľ hráč môže strieľať, nastavíme premennú na false a spustíme animáciu pištole zmenou image_speed. V udalosti Animation End nastavíme can_shoot opäť na true a image_index aj image_speed na 0. Výsledkom je, že hráč nemôže strieľať v kuse.

Aby sme zistili, čo guľka trafila, vykonáme nasledujúce. Urobíme malé kroky od súčasnej pozície hráča správnym smerom. Na každej pozícii sa uistíme, či nebol objekt zasiahnutý. Pretože všetky zaujímavé objekty sú potomkami objektu basic wall, iba skontrolujeme, či nie je na pozícii tento objekt. Ak áno, spýtame sa, či je to barel. Kedykoľvek zasiahneme basic wall, zastavíme cyklus, pretože to bude koniec cesty guľky. Kód, ktorý vložíme do udalosti Keyboard pre kláves <Space> bude vyzerať nasledovne:

{
  var xx, yy, dx, dy, ii;
  xx = obj_player.x;
  yy = obj_player.y;
  dx = 4*cos(obj_player.direction*pi/180);
  dy = -4*sin(obj_player.direction*pi/180);
  repeat (100)
  {
    xx += dx;
    yy += dy;
    ii = instance_position(xx,yy,obj_wall_basic);
    if (ii == noone) continue;
    if (ii.object_index == obj_barrel)
      with (ii) instance_destroy();
    break;
  }
}

Výsledok nájdete v súbore fps4.gmk nižšie. (Kód je trochu iný, ak si ukladáme pozíciu kamery a požadované hodnoty sínusu a kosínusu do globálnych premenných pre urýchlenie výpočtu, ale princíp je úplne totožný).


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 521x (427.35 kB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker

 

Všetky články v sekcii
Game maker - 3D hry
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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 sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity