|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
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 (armand@starnets.ro), 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 -
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) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||