Tutoriál na tvorbu 3D stříleček 5 - Střílíme na barely

Ostatní jazyky GameMaker 3D hry Tutoriál na tvorbu 3D stříleček 5 - Střílíme na barely

(Napsal Mark Overmars - (C) YoYo Games Ltd, pro devbook.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ženo 488x (427.35 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
Neaktivní uživatel:

jak mám udělat aby se střílelo levým tlačítkem myši,zkoušel jsem

if mouse_check_but­ton_pressed(mb_lef­t) and canShoot = true{}
ale nefunguje to,jestli to nebude tím že myší zaměřuju(viz.ko­mentáře u posledního dílu)

Odpovědět 14.6.2015 8:54
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 1 zpráv z 1.