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 5 - Střílíme na barely

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

Protože naše hra byla zamýšlena jako střílečka, měli bychom raději přidat možnost střílet. V této části budeme střílet pouze do barelů, které si do herního světa umístíme. V další části pak přidáme příšery.

Přidání barelů

Pro střílení barelů potřebujeme obrázek barelu. Vlastně potřebujeme 2, jeden když barel v klidu stojí a druhý, když exploduje. Půjčíme si nějaké obrázky ze hry Doom. Nalezneme je na http://www.cslab.ece.ntua.gr/~phib/doom1.htm . Oba sprity jsou animované. Pro jejich znázornění v místnosti také potřebujeme 2 sprity. Pro správnou animaci je nutné, aby měly stejný počet podobrázků. Vytvoříme si objekty barel a explodující barel. Obou dáme jako parrent basic wall, abychom jimi nemohli procházet. Objekt barel vložíme do místnosti na různá místa. Protože má pouze 2 podobrázky, nastavíme v události Create proměnnou image_speed na 0.1, čímž animaci zpomalíme. V události Draw vykreslíme příslušný podobrázek tak, jak jsme to dělali výše.

Když je barel zničen (tedy v událost Destroy), vytvoříme na jeho místě objekt explodující barel. I pro tento objekt nastavíme nižší rychlost animace. Když je barel zničen (tedy v událost Destroy), vytvoříme na jeho místě objekt explodující barel. I pro tento objekt nastavíme nižší rychlost animace. Protože barel neexploduje okamžitě, použijeme alarm, aby byl zvuk exploze slyšet až po krátké chvilce. K vykreslení použijeme opět stejný způsob, jako výše, ale s jedním trikem. Pomalu snižujeme alfa průhlednost, takže se exploze zprůhledňuje. Do Draw události vložíme:

draw_set_alpha(1-0.05*image_index);

Nakonec v události Animation end barel zničíme. Hru naleznete v souboru fps4.gmk.

Snadno byste mohli přidat další extra vlastnosti, např. že barely poblíž explodujícího barelu také explodují nebo že exploze zraní hráče, pokud je poblíž. V naší jednoduché hře jsme tyto věci neimplementovali.

Pistole

Pro pistoli opět použijeme animovaný sprite. Sprite má podobrázky pro pistoli v klidu (podobrázek 0) a pro střílení a nabíjení. Normálně vykreslujeme jen podobrázek 0 (proto nastavíme image_speed na 0), ale při výstřelu musíme projít celou animací. Chceme, aby se pistole vykreslovala přes herní scénu. Abychom toho dosáhli, musíme zajistit několik věcí. Zaprvé se objekt pistole musí vykreslit jako poslední. To zajistíme nastavením jeho depth na 100. Zadruhé už nemůžeme používat perspektivní projekci, ale změnit ji na normální orthografickou. Jako poslední musíme dočasně přepnout hidden surface removal (vykreslování skrytých ploch). Kód pro událost Draw objektu pistole bude vypadat 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šimněte si, že obrázek roztáhneme s faktorem 2 v obou směrech. Jinak je příliš malý. V dalším kroku událost Draw nastaví projekci zpět na perspective, nepotřebujeme ji zde nastavovat zpět.

Podobnou techniku můžete použít k vykreslení všech dalších potřebných věcí přes herní scénu. Níže ji také použijeme k zobrazení života hráče, můžete například zobrazovat instrukce, statistiky atd. Také můžete vykreslovat informace průhledně nastavením alfa hodnoty před samotným vykreslením.

Střelba

Nyní máme barel k sestřelení a pistoli, ale stále nemáme implementovaný střílící mechanismus. Protože máme brokovnici, kulky (zde broky) jsou velmi rychlé. Tvořit objekty nábojů tedy není řešením. Místo toho musíme v momentě stisknutí klávesy <Space> zjistit, na který objekt se střílí a pokud je to barel, necháme ho explodovat.

Jako první si uvedeme proměnnou can_shoot v objektu pistole, která indikuje, zda hráč může střílet. Nastavíme ji na true v události Create objektu pistole. Když hráč stiskne klávesu <Space>, zkontrolujeme proměnnou. Pokud hráč může střílet, nastavíme proměnnou na false a spustíme animaci pistole změnou image_speed. V události Animation End nastavíme can_shoot opět na true a image_index i image_speed na 0. Výsledkem je, že hráč nemůže střílet v kuse.

Abychom zjistili, co kulka strefila, provedeme následující. Uděláme malé kroky od současné pozice hráče správným směrem. Na každé pozici se ujistíme, zda nebyl objekt zasažen. Protože všechny zajímavé objekty jsou potomky objektu basic wall, pouze zkontrolujeme, zda není na pozici tento objekt. Pokud ano, zeptáme se, zda je to barel. Kdykoli zasáhneme basic wall, zastavíme cyklus, protože to bude konec cesty kulky. Kód, který vložíme do události Keyboard pro klávesu <Space> bude vypadat následovně:

{
  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ýsledek naleznete v souboru fps4.gmk níže. (Kód je trochu jiný, pokud si ukládáme pozici kamery a požadované hodnoty sinu a kosinu do globálních proměnných pro urychlení výpočtu, ale princip je naprosto totožný).


 

Stáhnout

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

Staženo 521x (427.35 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