Co zde najdete:

--- program jako celek
--- rozvržení objektů, popis procedur
--- výpočet trajektorie letu
--- generování terénu
--- výbuch střely


Program jako celek:


Hra Gata je programována v Borland Deplhi Personal Version 6.0. Použity byly jak původní komponenty Delphi, tak přidaná komoponenta DelphiX pro práci s knihovnami DirectX verze 6 a vyšší. Celý program vytvořený v Deplhi je řízen údálostmi uživatele. Tanky a střely jsou reprezentovány jako pole objektů. |nahoru|


Rozvržení objetků, popis procedur


V celém programu jsem vytvořil dvě třídy objektů:

Základní třidou jsou objekty typu TTank, které obsahují informace o jednotlivých hráčích a pozicích jejich tanků v bitevním poli.
Ttank = class
id:byte;
jmeno:string; ---- jméno hráče
x,y:integer;---- udává souřadnice pozice tanku na bitevním poli
x_cil,y_cil:integer; ---- uchovává poslední natočení děla
zivot:integer; ---- množství života
barva:byte; ---- určuje barvu hráče
pocet_zbrani:integer; ---- počítá počet zbraní
skore:integer; ---- skóre každého hráče
info:Tlabel; ---- položka typu TLabel, zobrazuje informace při hře v levém rohu obrazovky ( parent: Form1 )
z_im:Timage; ---- položka typu Timage, vykreslujeme do ní množství života, které má hráč v danou dobu (parent: Form1)
zbrane:array[1..MAX_POCET_ZBRANI] of Tzbran; ---- pole zbraní typu TZbran, zbraně přibývají v průběhu hry
constructor Init(aid:byte;ajmeno:string;abarva:byte); ---- konstruktor třídy Ttank
procedure vykresli_tank(barva_vykresleni:byte); ---- zobrazí tank v jeho aktuální pozici
procedure uprav_live(); ---- modifikuje jeho zobrazení života
procedure vyznac(typ:boolean); ---- označí právě aktualní hráče v bitevním poli červenou šipkou true= zobraz / false = skryj
end;

Každý tank má pole zbraní typu TZbran:
Tzbran = class
sila:byte; ---- poloměr výbuchu bomby, spolu s intenzitou hlavní konstanta při počítání zásahu
nazev:string; ---- jmeno zbrane
intenzita:byte; ---- účinnost zbraně, viz sila
pocet_naboju:integer; ---- pocet nábojů
cena:integer; ---- cena zbraně, za kolik se dá koupit
constructor Init(asila,aintenzita:byte;apn,a_cena:integer;anazev:string); ---- konstruktor třídy TZbran
procedure vybuch(dopad:Tpoint); ---- exploze bomby, volána při kolizi střely s povrchem země
end;
|nahoru|


výpočet trajektorie letu:


Při výpočtu trajektorie letu střely je použito klasického vzorce pro výpočet šikmého vrhu vzhůru. Pro generování tohoto pohybu, který bude mít tvar paraboly, je potřeba znát počáteční rychlost( rychlost vystřelní) a úhel, pod který střelu vypustíme.


Od okamžiku vystřelení budeme v určitém časovém okamžiku pomocí komponenty DXTimer přepočítávat x-ovou a y-ovou souřadnici střely pomocí dvou vzorců známých z fyziky:


V programu bude kód vypadat následovně:
x:=Trunc(vx*time);
y:=Trunc(vy*time-(1/2*0.3*(time*time)));


Toto přepočítávávání provádíme do doby, než narazíme na souřadnici x,y pixel o barvě země, v tom okamžiku provedeme výbuch bomby.V průběhu letu vykreslujeme dráhu střely, její tvar a barvy máme zajištěn pomocí pole OldPosition[], které ukládá postupně polohy střely, a pColors[], ve kterých jsou uloženy jednotlivé barvy ocasu střely.
|nahoru|


Generování terénu


-V programu je reprezentováno procedurou procedure hra_init(pocet_hracu:byte);. Vstupním parametrem je počet hráčů, které budeme rozmisťovat po hrací ploše. Postupně tak budeme určovat polohu každého tanku a nastavovat mu jeho souřadnice.
Generování terénu je prováděno pomocí náhodných čísel získávaných funkcí random().Vykreslování provádíme následovně:
- v prvním kroku vygenerujeme "náhodnou čáru" pomocí kreslící funkce LineTo. Náhodně vypočítáváme a určujeme pouze souřadnici y, souřadnici x zvyšujeme v cyklu o hodnotu 1. Abychom zajistili "kopcovitost terenu", používáme pomocnou proměnnou r, se kterou porovnáváme náhodně vygenerované číslo. Pokud podmínkou projde, upravíme hodnotu r přičtěním/odečtením hodnoty 1, abychom snížili pravděpodobnost projítí podmínkou v dalším cyklu generování. Pokud se dostaneme do určité vzdálenosti od horního/spodního okraje hrací plochy, opět změníme pravděpodobností hodnotu r, abychom zajistili správný směr generování čáry. X-ovou hodnotu zvětšujeme do veliksoti šířky hracího pole.
- v druhém kroku pomocí kreslící funkce FloodFill vykreslíme plochu pod vygenerovanou čarou.

Na začátku generování ještě rozpočítáme vzdálenosti mezi jednotlivými tanky, při zvětšování vzdálenosti x ověřujeme, zda jsme již narazili na x-ovou pozici tanku, a doplníme mu jeho aktulní y-ovou souřadnici.

|nahoru|


Výbuchu střely:


Jakmile dopadne střela na zem ( narazi na pixel o barvě země), dojde ke kolizi a vybuchne. Je však potřeba vyhloubit kráter a ověřit, kteří hráči dostali zásah.



Písmeno D označuje místo dopadu, máme tedy souřadnice dopad.x a dopad.y. S těmito souřadnice vstoupíme do procedury procedure aktul(d_x,d_y,sila,intenzita:integer);, která nám zajišťuje aktualizaci bojového pole. Nyní cyklem projdem všechny tanky, každého hráče, a ověříme, v jaké vzdálenosti od centra výbuchu se nacházel. Pokud již hráč nemá život (zivot < 0), tak se o něj nezajímáme a přejdem na dalšího. Pokud se pod hráčem nebude nácházet zem, provedem pád tanku, který také ubere život daného hráče. Velikost ztraceného života je přímo úměrná délce pádu. Vypočteme vzdálenost hráče od centra vybuchu (bod D), a pokud bude tato vzdálenost menší než síla výbuchu, znamená to, že tank/hráč utrpí ztráty.

Výpočet vzdálenosti:


Ztráty hráčů a jejích života se odvíjí od vzdálenosti od centra výbuchu a jsou závislé také na intenzitě střely.
Velikost ztraceného života = vzdálenost / síla * intenzita . Protože při vstupu do této větve podmínky máme zajištěno, že vzdálenost je vždy menší než síla výbuchu, a intenzita není nikdy větší než 100, nemůžeme normálně jedním zásahem zničit protivníka.

|nahoru|