Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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 strieľačiek 6 - Pridávame nepriateľov

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

Je síce pekné, že vieme strieľať barely, ale to nie je tak zábavné. Budeme potrebovať nejaké nepriateľov. V tomto tutoriále pridáme len jeden typ príšery, ale akonáhle porozumiete tomu, ako to funguje, je ľahké pridať ďalšie. Pre príšeru potrebujeme 2 animované sprity, jeden keď je nažive a druhý keď zomiera. Obaja si stiahneme zo stránky o DOOMe, ktorá bola spomenutá minule. Tiež budeme potrebovať sprite, ktorý bude reprezentovať príšeru v roomu a bude použitý na detekciu kolízie.

Vytvoríme 2 objekty, jeden pre živú príšeru a druhý pre príšeru, keď zomiera. Keď príšera umiera, vytvoríme na jej pozíciu objekt umierajúci príšery. Funguje to úplne rovnako, ako u barelu. Je tu len jediný rozdiel. Na konci animácie mŕtvu príšeru nezničíme, ale necháme ju tam ležať, len sa zobrazením posledného podobrázku z animácie. Za týmto účelom v udalosti Animation end pridáme akciu Change sprite a nastavíme správny podobrázek (7) a rýchlosť na 0.

Aby sme mohli príšery strieľať, môžeme použiť tú istú techniku ako u sudov. Ale musíme urobiť niekoľko zmien. Ako prvý nechceme, aby boli príšery potomkami objektu basic wall. Robilo by to problémy, keď sa budú pohybovať. Preto vytvoríme nový objekt obj_monster_ba­sic. To bude parrent objekt pre všetky príšery (aj napriek tomu, že teraz máme len jednu). Druhá zmena je, že budeme chcieť strieľať cez rastliny. Preto vytvoríme objekt basic plant. (Objekt basic plant bude mať ako parrent basic wall, pretože nechceme, aby sa cez rastliny dalo chodiť). Strieľajúci kód je teraz doplnený a vyzerá 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 (50)
  {
    xx += dx;
    yy += dy;
    ii = instance_position(xx,yy,obj_wall_basic);
    if (ii == noone)
    {
      ii = instance_position(xx,yy,obj_monster_basic);
      if (ii == noone) continue;
      with (ii) instance_destroy();
      break;
    }
    if object_is_ancestor(ii.object_index,obj_plant_basic) continue;
    if (ii.object_index == obj_barrel)
       with (ii) instance_destroy();
    break;
  }
}

Je to z veľkej časti totožné s minulým kódom. Najprv zistíme, či je múr zasiahnutá. Ak nie, zistíme, či je zasiahnutá príšera a ak áno, zničíme ju. Ak bola zasiahnutá múr, zistíme, či sa jedná o inštanciu rastliny a ak áno, môžeme pokračovať (strela preletí rastlinou).

(Funkcia object_is_ancestor (obj1, obj2) nám odpovie, či je obj2 predok obj2, teda jeho parrent). Keď strelíte do barelu, necháme ho explodovať. Hru nájdete v súbore fps5.gmk.

Posledný vecou je, aby príšera napádala hráčov. Táto príšera nebude strieľať, ale jednoducho prechádzať hráčom. Keď sa hráča dotkne, stratí nejaký život. Ako iste viete, mechnismus života je v Game Makeru zabudovaný. V udalosti Create nastavíme health na 100. V objekte pištole, ktorý tiež funguje pre kreslenie cez herné scénu, môžeme vykresliť health bar, trochu priehľadný, ako naznačuje nasledujúci kód:

draw_set_alpha(0.4); draw_healthbar(5,460,100,475,health,c_black,c_red,c_lime,0,true,true);
draw_set_alpha(1);

A v udalosti No More Health hru jednoducho reštartujeme (je to trochu nudné, popremýšľajte do budúcnosti nad niečím lepším).

Aby príšera na hráča útočila, vložíme do objektu príšery do udalosti Begin step nasledujúci kód:

{
  if (point_distance(x,y,obj_player.x,obj_player.y) > 200)
    { speed = 0; exit; }
  if (collision_line(x,y, obj_player.x,obj_player.y,
                                obj_wall_basic,false,false))
    { speed = 0; exit; }
  if (point_distance(x,y, obj_player.x,obj_player.y) < 12)
  {
    speed = 0; health -= 2;
    if not sound_isplaying(snd_ow) sound_play(snd_ow);
    exit;
  }
  move_towards_point(obj_player.x,obj_player.y,1.4);
}

Ten vykoná nasledovné: Ak je vzdialenosť od príšery k hráčovi príliš vysoká, neurobíme nič a jednoducho nastavíme rýchlosť na 0. Ak príšera hráčov nevidí (čiara od nej k hráčovi koliduje so stenou), tiež neurobíme nič. Príšera prenasleduje hráča len vtedy, keď ho vidí. Ak je vzdialenosť menšia než 12, berieme to ako že na hráča útočia a začneme znižovať jeho život a prehráme zvuk. Inak sa približujeme k hráčovi zvolenou rýchlosťou. (Všimnite si, že by sme mohli prvý test vynechať, ale funkcia pre test kolízie s čiarou je celkom pomalá, preto ju budeme vykonávať len vtedy, keď je príšera blízko). Aby sa príšera vyhýbala múrom, môže využiť ten istý zklouzávací mechanizmus, ako má hráč. (Vlastne to dáme do basic monštier, pretože to bude pre všetky príšery rovnaké).

Teraz stačí umiestniť niekoľko príšer na dôležité miesta v hre a som hotoví. Naše prvé 3D strieľačka je takmer hotová. Hru nájdete nižšie v súbore fps5.gmk. Určite by ste mali vytvoriť východ do ďalšej miestnosti, ktorý bude strážený príšerami. A tiež vytvoriť ďalšie miestnosti. Tiež by ste mali vytvoriť nejaké ďalšie príšery a pridať do sveta nejaké ďalšie predmety, ako je napr. Balíček so životom. Ďalej by ste mohli pridať príšere život, aby bolo potrebné viac rán a možno nájsť lepšie zbrane a muníciu. Rozšírenie je len na vás. Nejaké základné nápady na vylepšenie si preberieme nabudúce.

strieľanie príšer - Game maker - 3D hry

 

Stiahnuť

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

Stiahnuté 419x (501.86 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