Pravidla Ucet
Nepřihlášen

Článek

Menu

First Person Shooter - 2. část
Napsal: Satik64
Přidáno: 24.07. 2010

V druhé části seriálu založeném na tutoriálu Marka Overmarse pro tvorbu střílečky v GM3D přidáme do naší hry mlhu, objekty a ukážeme si jak zlepšit hratelnost.

V tomto díle budeme vylepšovat „hru“ vytvořenou minule. Jako první přidáme nějakou malou změnu, s použitím odlišných druhů zdí. Potom vylepšíme level design. Ke zlepšení grafického vzhledu (a přidání trochu děsivosti) přidáme do světa mlhu. Vylepšíme pohyb po světě a nakonec přidáme objekty.

 

Zlepšení hratelnosti

  Více odlišných zdí

Svět, jaký jsme navrhli vypadal doteď poněkud nudně. Všechny zdi vypadají stejně. Nejenom že je to nudné, ale i obtížné pro hráče orientovat se ve světě. Je to špatný game design (pokud to není záměr hry). Je lepší když si hráč snadno zapamatuje kde je a odkud přišel.


Řešení tohoto problému je dost jednoduché. Přidáme počet textur ve hře a uděláme více zdí. Ty budou stejné jako původní, jenom jim přiřadíme jinou texturu. Nezapomeňte dávat všem objektům zdi jako jejich parent obj_wall_basic. S použitím odlišně barevných spritů pro odlišné zdi se líp tvoří level. (tyto sprity nejsou použity ve hře, ale zobrazí se v levelech)


Lepší level design

Stávající level má několik chyb. Ze všeho nejdřív, zdi vypadají velmi ploše, protože jsou vidět z obou stran. Tomu bychom se měli vyhnout. Dále, snažili jsme se vyplnit level oblastmi. Ikdyž je to normální pro reálné stavby, pro hry to moc dobré není. K získání zajímavých překvapení bude lepší rozdělit oblasti chodbami. Přidáním zatáček v chodbách snížíme oblast světa kterou hráč vidí najednou. To zvětší pocit nebezpečí. Nikdy nevíte co se nachází za dalším rohem. (jak uvidíme níže, jsou různé důvody proč dělat menší cesty. Umožňuje tvořit grafiku rychleji vykreslováním menší části levelu.)

 

K vytvoření rozptýlenějšího levelu budeme potřebovat více místa. Takže celkem dost zvětšíme velikost roomu. Abychom zamezili změně velikosti okna, použijeme samostatný view okna které chceme. Na pozici viewu v roomu nezáleží, protože stejně nastavujeme kameru sami. Tady je obrázek části nového levelu. Odlišné barvy zdí znamenají odlišné textury.

 

Přidání mlhy

K přidání děsivějšího pocitu můžeme do naší hry přidat mlhu. Mlha způsobí, že objekty v dálce vypadají tmavší než blíž (nebo světlejší, podle nastavené barvy mlhy). Když je objekt opravdu daleko, stává se neviditelným. Mlha přidává hře atmosféru, dává lepší pocit hloubky a vzdálenosti, a je možné vyhnout se vykreslováním objektů v dálce, to dělá hru rychlejší. K zapnutí mlhy přidáme následující řádek do Execute Code v eventu Create postavy (po zapnutí 3D)

d3d_set_fog(true,c_black,10,300);

Mlha je zaplá, s černou barvou, počáteční vzdálenost 10, a stává se kompletně černou ve vzdálenosti 300. (Pozn: Na některých grafikách není mlha podporována. Takže bude lepší, když na ní vaše hra nebude záviset.) Se zapnutou mlhou může svět vypadat takto:

 
  Lepší pohyb

Co je ještě potřeba udělat je zlepšení řízení pohybu. Když narazíte na objekt, hned se zastavíte. To není moc hezké a dělá to pohyb v chodbách obtížný. Když narazíte na zeď malým nakloněním, měli byste klouzat kolem zdi než zastavit. K docílení toho budeme muset udělat nějaké změny. Nejdřív, zdi už nebudou solidní. Když jsou objekty solidní, nemůžeme přesně řídit, co se stane v případě kolize, protože na to systém není. Ale my chceme plnou kontrolu. Takže všechny objekty zdí uděláme nesolidní. V eventu Collision vložíme Execute Code s tímto kodem:

 
{
x=xprevious;
y=yprevious;

if (abs(hspeed) >= abs(vspeed) &&
not place_meeting(x+hspeed,y,obj_wall_basic))
{ x+=hspeed; exit; }

if (abs(vspeed) >= abs(hspeed) &&
not place_meeting(x,y+vspeed,obj_wall_basic))
{ y+=vspeed; exit; }
speed=0;
}

Tento kod bychom měli číst následovně. V prvních dvou řádvích nastavíme postavu zpět na předchozí pozici (pro zrušení kolize). Dál zjistíme, jestli se hráč může pohybovat horizontálně (klouzání podél horizontální zdi). Vykoná se jenom když je horizontální rychlost větší než vertikální. Pokud horizontální pozice klouzání nekoliduje se zdí bude tam přemístěn. Další je stejné jen s vertikálním klouzáním. Pokud se oba nesplní, nastaví se speed na 0 a pohyb se zastaví.


Další změna, kterou provedeme, je, že umožníme hráči chodit i běhat. Když hráč podrží klávesu <Shift>, uděláme rychlejší pohyb. Toho dosáhneme následujícím: V <Up> a <Down> keyboard eventu otestujeme stisknutou klávesu <Shift>, pokud stisknutá je, umožníme takto rychlejší pohyb:

{
var maxspeed;
if keyboard_check(vk_shift) maxspeed = 3 else maxspeed = 1.5;
if (speed < maxspeed ) speed = min(maxspeed,speed+0.4);
}

Poslední věc z většiny First Person střílečkek je, že se hráč může pohybovat do stran. Pro toto použijeme klávesy <z> a <x>. Pohyb by měl být kolmý k aktuálnímu směru hráče. Do klávesy <z> přijde kod:

{
var xn,yn;
xn = x-sin(direction*pi/180);
yn = y-cos(direction*pi/180);
if not place_meeting(xn,yn,obj_wall_basic)
{ x = xn; y = yn; }
}

Kod pro klávesu <x> bude podobný. Můžete naši hru vyzkoušet v souboru fps2.gmk (ke stažení pod článkem)


Přidání objektů do herního světa

Náš svět je stále poněkud prázdný. Jsou zde jenom některé zdi. V této části přidáme nějaké další objekty do našeho světa. Jedná se o hlavně o dekorace, ale hráči (a protivníci) se za nimi můžou i skrývat. Celkově existují 2 možnosti jak přidávat objekty do světa. První možnost je vytvoření trojrozměrných objektů obsahující textury mapované triangly. To dává pěkný efekt, ale je to náročnější, jak na vytvoření tak vykreslení. Místo toho jednoduše použijeme sprity k zobrazení těchto objektů v našem světě. Použijeme tuto techniku pro všechno v našem světě: střely, rostliny, zbraně, exploze, atd. Ale je to trochu složitější, než se zdá. Sprity jsou plošné, pokud se na ně díváme ze špatného směru, nejsou vidět. Vyřešíme to natočením spritů k hráči.


Natočení spritů

Jako příklad vytvoříme objekt rostliny, který můžeme umístit do roomu, čím bude vypadat zajímavěji. Stejně jako hráč a zdi použijeme velmi jednoduchý sprit k označení objektu rostliny v roomu. Je to snadné pro designování roomu a bude to použito i pro ověření kolize, aby se hráč nemohl přes rostliny pohybovat. Vytvoříme objekt rostliny a opět mu dáme parent našeho objektu základní zdi. Takže pro hráče se bude rostlina chovat jako zeď. Budeme ale přepisovat draw event, protože musíme vykreslovat něco jiného. Pro vykreslení rostliny potřebujeme pěkný sprit. Tento sprit bude částečně průhledný a pro lépe vypadající hrany přepneme volbu smooth the edges. V Draw eventu použijeme tento sprit k vykreslení na vertikální zdi. Protože je sprit částečně průhledný, bude vidět jen část zdi.


Je tu ale jeden závažný problém. Sprite je plochý obrázek. Pokud ho vidíte z boku, stává se velmi tenkým a dokonce se ztrácí. Vyřešit to můžeme jednoduchým trikem, který je použit v mnoha jiných hrách. Necháme sprite vždycky nakloněný ke kameře. Takže nezávisle na směru, z jakého se díváme, bude sprite vypadat pořád stejně.To je možnost rotace k hráči. Ikdyž to může vypadat nepřirozeně, efekt je docela dobrý. Takže jak to uděláme? Potřebujeme trochu arytmetiky. Následující obrázek ukazuje polohu. Å ipka ukazuje směr, kterým se hráč dívá, označený D. Černý čtverec znázorňuje sprite. Za předpokladu, že sprite má délku 2L, pozice dvou rohů jsou:

(x-L.sin(D*pi/180),y-L.cos(D*pi/180))
(x+L.sin(D*pi/180),y+L.cos(D*pi/180))
 
 

Tímto kodem můžete nahradit event Draw v objektu rostliny.

{
var ss,cc,tex;
tex = sprite_get_texture(spr_plant,0);
ss = sin(obj_player.direction*pi/180);
cc = cos(obj_player.direction*pi/180);
d3d_draw_wall(x-7*ss,y-7*cc,20,x+7*ss,y+7*cc,0,tex,1,1)
}

V tomto kodu určíme správný sprit textury, vypočítáme 2 hodnoty vysvětlené výše a pak vykreslíme sprit na 14x20 velkou zeď stojící na podlaze, otáčející se ve správném směru. Přesná velikost a pozice závisí na objektu, který má být vykreslen.


Pokud je více spritů, které musí být vykresleny touto cestou, je lepší ukládat sinus a cosinus do globálních proměnných, aktualizovaných objektem postavy, než samostatné vkládání pro každý sprit, který musí být vykreslen. Toto je způsob, kterým budeme pracovat ve hře. V eventu End Step objektu postavy vložíme dvě hodnoty do globálních proměnných camsin a camcos.


Je tu ale závažný problém. Když jsou hrany spritů částečně průhledné (díky jejich vyhlazení) musíme si dávat pozor, ve kterém objektu se vykreslují. Částečně průhledné (alpha blended) sprity jsou míchány s objekty, které byly vykresleny dřív. K získání potřebného efektu, průhledné vyhlazené sprity musí být vykresleny po vykreslení všech ostatních objektů. Toho se dá jednoduše dosáhnout přiřazením objektům rostlin (a dalších) zápornou hloubkou (depth). Výsledek přidání nějakých rostlin může vypadat takto:

 
 

Tímto způsobem můžete vytvořit hodně různých objektů do vaší hry a umístit do roomu. (ale nepřehánějte to. Může to hru zpomalit a brzdit hraní.)


Animované objekty

Podobnou cestou můžeme také vytvářet animované objekty. V tomto případě jsou jenom 2 důležité body. Jako první, potřebujeme sprit skládající se z několika podobrázků pro animaci. Musíme se ujistit, že současný sprit používá k zobrazení objekt, který má stejný počet podobrázků, jinak nemůžeme použít zabudovanou proměnnou image_index. Druhý, ve vykreslovacím eventu musíme přiřadit odpovídající podobrázek použitím proměnné image_index. Tady je typický kod kterým může být proveden v Draw eventu objekt nějaké exploze. Jak je vidět, používá také nastavení průhlednosti.

{
var ss,cc,tex;
tex = sprite_get_texture(spr_explosion,image_index);
ss= sin(obj_player.direction*pi/180);
cc= cos(obj_player.direction*pi/180);
draw_set_alpha(0.7);
draw_set_color(c_white);
d3d_draw_wall(x-8*ss,y-8*cc,2,x+8*ss,y+8*cc,18,ttt,1,1);
draw_set_alpha(1);
}
 

Postup vytvořené hry můžete najít v souboru dole.


V dalším díle přidáme do naší hry střelbu, výbušné předměty a jednoduché nepřátele.  
Aktuální hru stahujte tady

Ostatní díly seriálu:
[24.07. 2010] - First Person Shooter - 4. část
[24.07. 2010] - First Person Shooter - 3. část
[24.07. 2010] - First Person Shooter - 1. část
Klíčová slova: first person shooter fps 3D GM3D
 

Komentáře:

Napsal: NicharCZ
Přidáno: 25.07. 2010

Perfektní ;)

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010