Tutoriál na tvorbu 3D stříleček 6 - Přidáváme nepřátele

Ostatní jazyky GameMaker 3D hry Tutoriál na tvorbu 3D stříleček 6 - Přidáváme nepřátele

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

Je sice hezké, že umíme střílet barely, ale to není tak zábavné. Budeme potřebovat nějaké nepřátele. V tomto tutoriálu přidáme jen jeden typ příšery, ale jakmile porozumíte tomu, jak to funguje, je snadné přidat další. Pro příšeru potřebujeme 2 animované sprity, jeden když je naživu a druhý když umírá. Oba si stáhneme ze stránky o Doomu, která byla zmíněna minule. Také budeme potřebovat sprite, který bude reprezentovat příšeru v roomu a bude použit k detekci kolize.

Vytvoříme 2 objekty, jeden pro živou příšeru a druhý pro příšeru, když umírá. Když příšera umírá, vytvoříme na její pozici objekt umírající příšery. Funguje to úplně stejně, jako u barelu. Je tu jen jediný rozdíl. Na konci animace mrtvou příšeru nezničíme, ale necháme jí tam ležet, jen se zobrazením posledního podobrázku z animace. Za tímto účelem v události Animation end přidáme akci Change sprite a nastavíme správný podobrázek(7) a rychlost na 0.

Abychom mohli příšery střílet, můžeme použít tu samou techniku jako u sudů. Ale musíme udělat několik změn. Jako první nechceme, aby byly příšery potomky objektu basic wall. Dělalo by to problémy, když se budou pohybovat. Proto vytvoříme nový objekt obj_monster_ba­sic. To bude parrent objekt pro všechny příšery (i přesto, že nyní máme jen jednu). Druhá změna je, že budeme chtít střílet přes rostliny. Proto vytvoříme objekt basic plant. (Objekt basic plant bude mít jako parrent basic wall, protože nechceme, aby se přes rostliny dalo chodit). Střílející kód je nyní doplněn a vypadá 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 (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 velké části totožné s minulým kódem. Nejprve zjistíme, zda je zeď zasažena. Pokud ne, zjistíme, zda je zasažena příšera a pokud ano, zničíme ji. Pokud byla zasažena zeď, zjistíme, zda se jedná o instanci rostliny a pokud ano, můžeme pokračovat (střela proletí rostlinou).

(Funkce object_is_ances­tor(obj1, obj2) nám zodpoví, zda je obj2 předek obj2, tedy jeho parrent). Když střelíme do barelu, necháme ho explodovat. Hru naleznete v souboru fps5.gmk.

Poslední věcí je, aby příšera napadala hráče. Tato příšera nebude střílet, ale jednoduše procházet hráčem. Když se hráče dotkne, ztratí nějaký život. Jak jistě víte, mechnismus života je v Game Makeru zabudován. V události Create nastavíme health na 100. V objektu pistole, který také funguje pro kreslení přes herní scénu, můžeme vykreslit health bar, trochu průhledný, jak naznačuje následující 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 události No More Health hru jednoduše restartujeme (je to trochu nudné, popřemýšlejte do budoucna nad něčím lepším).

Aby příšera na hráče útočila, vložíme do objektu příšery do události Begin step následující 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á následující: Pokud je vzdálenost od příšery k hráči příliš vysoká, neuděláme nic a jednoduše nastavíme rychlost na 0. Pokud příšera hráče nevidí (čára od ní k hráči koliduje se zdí), také neuděláme nic. Příšera pronásleduje hráče jen tehdy, když ho vidí. Pokud je vzdálenost menší než 12, bereme to jako že na hráče útočí a začneme snižovat jeho život a přehrajeme zvuk. Jinak se přibližujeme k hráči zvolenou rychlostí. (Všimněte si, že bychom mohli první test vynechat, ale funkce pro test kolize s čárou je docela pomalá, proto ji budeme provádět jen tehdy, když je příšera blízko). Aby se příšera vyhýbala zdem, může využít ten samý zklouzávací mechanismus, jako má hráč. (Vlastně to dáme do basic monster, protože to bude pro všechny příšery stejné).

Nyní stačí umístit několik příšer na důležitá místa ve hře a jsem hotoví. Naše první 3D střílečka je téměř hotová. Hru naleznete níže v souboru fps5.gmk. Určitě byste měli vytvořit východ do další místnosti, který bude hlídán příšerami. A také vytvořit další místnosti. Také byste měli vytvořit nějaké další příšery a přidat do světa nějaké další předměty, jako je např. balíček s životem. Dále byste mohli přidat příšeře život, aby bylo potřeba více ran a možná najít lepší zbraně a munici. Rozšíření je jen na vás. Nějaké základní nápady na vylepšení si probereme příště.

Střílení příšer

 

Stáhnout

Staženo 388x (501.86 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 (2 hlasů) :
4.54.54.54.54.5


 



 

 

Komentáře
Zobrazit starší komentáře (2)

Avatar
jakzie2
Člen
Avatar
jakzie2:

Potřebuju udělat objekt který se bude pohybovat sem a tam a odrážet se od zdí
ale at dělám cokoliv ten objekt se prostě hýbat nezačne

 
Odpovědět 8.11.2012 18:19
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na jakzie2
David Čápka:

Pokud máš problémy s tímhle, tak začni hezky postupně s 2d tutoriály, máme jich tu dost :)

Odpovědět 8.11.2012 18:22
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Petr Nymsa
Redaktor
Avatar
Odpovídá na jakzie2
Petr Nymsa:

To je vcelku jednoduché :). Stačí jej posouvat po X-ových souřadnicích. Jakmile bude mít souřadnice větší než šířka obrazovka směr obratíš. A potom zase obráceně a takhle stále dokola. Kód ti psát nebudu, zkus to sám ;)

Odpovědět 8.11.2012 18:24
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Nymsa
David Čápka:

Jsou k tomu ikony, je to práce na 10 vteřin, ať si udělá zdejší tutoriál na arkanoid :)

Odpovědět 8.11.2012 21:17
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
jakzie2
Člen
Avatar
Odpovídá na David Čápka
jakzie2:

dík zirko funguje to dobře a to s těmi ikonami to ve 3d nefunguje :D

Editováno 9.11.2012 16:01
 
Odpovědět 9.11.2012 15:58
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 9.11.2012 16:07
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
jakzie2
Člen
Avatar
Odpovídá na David Čápka
jakzie2:

když to udělam ikonama tak se hýbe jenom objekt a ne textura

 
Odpovědět 9.11.2012 16:23
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na jakzie2
David Čápka:

Tak to děláš špatně :) Textura se logicky hýbe s objektem (protože je to jeho grafická reprezentace), pokud ne, špatně ji vykresluješ.

Odpovědět 9.11.2012 17:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
myzztiq
Člen
Avatar
myzztiq:

Zdravim. Ako zmenim pls healthbar? Nejak to tam nemozem najst. Dakujem :-)

 
Odpovědět 25.6.2013 12:24
Avatar
Neaktivní uživatel:

jak mám změnit sprite v závislosti na nepřítelově směru pohybu

např.nepřítel jde do leva a já se dívám z úhlu kde bych ho měl vyďet zezadu tak změním sprite na sEnemiBack,ale jak mám vypočítat souvislost mezi úhlem pohledu a směrem pohybu nepřítele
díky za odpověď

Odpovědět 17.6.2015 18:48
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 10 zpráv z 12. Zobrazit vše