Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Delphi
Tvorba her v DelphiX - 5.díl
delphix5
26. července 2001, 00.00 | Další pokračování seriálu o tvorbě her v DelphiX. Dnes si ukážeme, jak rozpohybovat raketu ve vesmíru a přidáme i střílení. Stáhněte si už hotový projekt, nebo jen hezké sprity rakety do vaší hry !
Po delší době se k vám opět dostává další díl seriálu o programování her v DelphiX. Dnes si ukážeme, jak naprogramovat raketku, která se bude pohybovat na formuláři podle fyzikálních zákonů (nebo spíš počítačových..). Tak se do toho dáme.Začneme tedy raketkou. Ne každý programátor je zrovna rozený grafik (jinak by grafici neměli co dělat a celou hru by mohl udělat programátor), tak tady máte obrázek jednoho takového vesmírného plavidla. Nekreslil jsem jej já, ale Armand Niculescu (), zde máte již vyrenderovaný obrázek z Maxka:
Do naší hry by nám samozřejmě stačil i nějaký ten low polygon model, ale když je při ruce něco lepšího, proč to nepoužít. Takto vypadá raketa doopravdy:
Spusťte tedy delphi, vytvořte nový projekt, na formulář dejte komponenty DXDraw, DXTimer, DXImageList a do Items DXImageListu přidejte dva obrázky rakety. Pojmenujte je ship a shipburn, nezapomeňte nastavit Transparent na true. Aby raketa létala na všech počítačích přibližně stejnou rychlostí, nastavte si ještě Interval u DXTimeru na 16. Docílíme tím toho, že FPS bude přibližně 60.
Dále si definujeme pár proměnných naší raketky - Angle typu integer, kde bude uložen úhel ve stupních, XPos, YPos typu real, kde bude uložena pozice rakety a XVel,YVel typu real, kde bude rychlost rakety v x a y směru.
Nyní si ještě musíme vysvětlit, jak budeme ovládat pohyb rakety. (To, že k tomu budeme používat klávesnici je snad jasné :) Použijeme komponentu DXInput z palety DelphiX. Při každém vykonání procedury DXTimer.OnTimer obnovíme stav DXInputu, a poté přečteme stisknuté klávesy.
Vytvořte tedy proceduru DXTimer.OnTimer, a do ní přidejte následující řádky, které zajistí otočení rakety po nebo proti směru hodinových ručiček:
|
Komentář snad netřeba. Problém je v tom, že při spuštení programu nic nevídíme. Proto je na čase začít raketu kreslit. Nejprve však musíme zjistit úhel otočení od 0 do 255, který si uložen do proměnné XAngle (takže si ji nesmíte zapomenou definovat). Dále si definujeme proměnnou Burn typu boolean, podle které poznáme, zda kreslit raketu normální, nebo s tryskami. Zde je kód pro převod úhlu a kreslení rakety:
|
Nyní, když program spustíte, zjistíte, že opravdu můžete s raketkou otáčet. Ale co pohyb ? Na ten se vrhneme nyní. K pohybu použijeme šipku nahoru, proto musíme otestovat, zda-li je zrovna stisknutá. Pokud ano, zvětšíme rychlost XVel a YVel podle otočení rakety. Poté tyto hodnoty přičteme k proměnným XPos a YPos. Pokud bychom to takto nechali, letěla by raketa stále dál, a její rychlost by se stále zvětšovala, až by byla opravdu velká. To nechceme, a proto budeme simulovat odpor tím, že proměnné XVel a YVel budeme zmenšovat. Také musíme ošetřit, pokud se raketa dostane ke kraji plochy - v tom případě ji přesuneme na opačnou stranu. Zde je již celý výsledný kód (doufám dostatečně okomentovaný):
|
Projekt můžete spustit a hle - s raketou můžete hezky létat po celé ploše zatáčet, otáčet... Není to přesně to, co jste chtěli ?
Aby nebylo pozadí tak černé, můžete přidat nějaký ten obrázek, třeba tento:
Stačí obrázek přidat do Items DXImageListu, nastavit Transparent na false, Name na pozadi, a do procedury DXTimer.OnTimer přidat před všechno tento řádek:
|
Zde je konečně i screenshot aplikace:
A to ještě pořád není vše ! Přidáme si totiž ještě střílení. Pro střílení budou dvě možnosti - buď budeme co nejrychleji stlačovat šipku dolů, nebo ji prostě necháme stisknutou, a raketa bude střílet také. V druhém případě však budou mezi jednotlivými střelami znatelně větší prodlevy.
Pro střely si musíme vytvořit konstantu MaxStrel, která bude určovat, kolik je možno vystřelit střel najednou a také typ Strela, z kterého si potom uděláme pole Missile. Dále si vytvoříme proměnné FireCount a MisCount typu integer. Proměnná FireCount se nám postará o to, aby se při stisknuté klávese šipka dolů nestřílelo neustále, ale pouze po x-té. Při každém volání procedury DXTimer.OnTimer se totiž proměnná FireCount zvětší, a střela se vystřelí, pouze pokud bude FireCount deset (náhodně zvolené číslo, můžete samozřejmě použít i jiné). V proměnné MisCount bude uloženo číslo aktuální střely, kterou můžeme použít. Zde je všechno hezky popořadě:
|
Dále si v proceduře DXTimer.OnTimer definujeme dvě pomocné proměnné mx a my typu real. To by nám snad stačilo, zde je již celý kód, který se stará o vystřelení, update a nakreslení střely. Úplně bych zapomněl - samozřejmě musíte nejdříve nějaký ten obrázek střely nareslit, vložit do DXImageListu a pojmenovat strela. Druhou možností je použít tento - . Zde je již slibovaný kód:
|
Projekt přeložte, spusťte a pokud je vše v pořádku, měla by vaše raketka po stisknutí šipky dolů začít střílet. Třeba jako zde na obrázku:
A to je pro dnešek již doopravdy vše, pro veškeré další nápady,připomínky a dotazy je místo dole v diskuzi.
Download
ZDE si můžete stáhnout dnes vytvořený program a jeho zdrojáky (670 kB)
Obsah seriálu (více o seriálu):
- Tvorba her v DirectX v Delphi - 1. díl
- Tvorba her v DelphiX - 2. díl
- Tvorba her v DelphiX - 3. díl
- Tvorba her v DelphiX - 4. díl
- Tvorba her v DelphiX - 5.díl
- Bludiště v DelphiX
- Kolize ve hrách v DelphiX
- Posuvný text v DelphiX bez komponenty
- Posuvný text v DelphiX podruhé
- Speciální grafické efekty v DelphiX
- TurboPixels aneb rychlé pixely v DelphiX
- Let s vrtulníkem v DelphiX
- Stíny a světla trochu jinak
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007