Let s vrtulníkem v DelphiX - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kde se koná výstava fotografií Luďka Vojtěchovského?

V dnešní soutěži hrajeme o:



Delphi

Let s vrtulníkem v DelphiX

delphix_vrtulnik

12. března 2002, 00.00 | Chcete si v DelphiX zalétat s vrtulníkem ? Není nic jednoduššího než si přečíst tento článek, jako vždy najdete kompletní návod na tvorbu grafiky pro hry i samotné obrázky !



Po dlouhé době vám opět přináším článek o tvorbě her. Jak jste si již mohli zvyknout, bude i tento spíš o grafice, protože jak prohlížím české freewarové hry, grafika je právě to co zaostává. Je to samozřejmé, že každý programátor hned nenajde výborného grafika, a tak si prvních pár her jednoduše dělá obrázky do hry sám. Proto bych chtěl pomoci právě těmto programátorům, ať to je trochu lepší ;)

V našem jednoduchém demontračním programu který z nadsázkou budeme nazývat hra dokonale využijeme procesor a grafickou kartu. Budeme totiž kreslit stín a světlo, tudíž nakonec budeme rádi za patnáct snímků za sekundu. Abych ale pověděl to hlavní - na malé ploše s pozadím země budeme létat s vrtulníkem, který bude mít realistickou vrtuli a na cestu si bude svítít. Jak již mnozí uhodli, začneme pozadím, po němž bude následovat tvorba vrtulníku.

Pozadí

Pozadí by ve skutečnosti mohlo být jakékoliv, o to nám totiž ani moc nejde. Ovšem pokud má hra vypadat pěkně, musí být pěkné všechny její části a tak jsem si dal záležet i na pozadí. Nakreslil jsem jej v programu Metacreation Painter, který je na toto jako stvořený. Nebudu tady vysvětlovat postup, ale rovnou ukážu obrázek (ve skutečnosti se jedná o část obrázku pozadí které jsem kreslil pro jednoho nejmenovaného člověka pro jednu nejmenovanou hru).


Vrtulník

Dostáváme se k nejobsáhlejší kapitole, a to je tvorba obrázků vrtulníku, listů rotoru a předního světla. K vrtulníku budeme potřebovat 3D studio MAX nebo jiný 3d modelovací program, alespoň částečná znalost tohoto programu je také vítána.
Nejprve musíme nějaký ten model vrtulníku sehnat nebo vymodelovat. Já jsem se rozhodl pro možnost první, jelikož na internetu je zdrojů dost a navíc by to byla akorát zbytečná ztráta času (na konci bude mít obrázek přibližně 140x140 pixelů, tudíž nikdo nepozná, jestli měl vrtulník 100 nebo 10000 polygonů). Spustíme tedy MAXko a dáme se do práce.
Otevřeme model vrtulníku (File / Open) a znaleckým okem jej prohlédneme. Ten můj byl celý šedý, což se mi vubec nelíbílo, a tak jsem se jej rozhodl trochu změnit. Stačí kliknutí do Rendering / Material editor, nebo stisknutí písmene M a všechny materiály máte při ruce. Klikněte na kapátko a následně na model ze kterého chcete materiál načíst:


V material editoru se nám hned objeví, v mém případě multi materiál. Postupně klikejte na jednotlivé materiály a hrajte si z nastavením barev, stínů, světel až budete spokojení. Můj multi nateriál po všech úpravách vypadal nějak takto (modrá - okna, žlutá - vtrulník, černá - listy rotoru, atd...):


Pokud se podíváte na začátek článku, uvidíte jak vlastně vrtulník vypadá.
Když jste spokojeni můžete okno zavřít a posunout vrtulník nějak doprostřed. Nejjednodušší způsob je kliknutí na ikonky move (šipky na všechny strany) nejdřív levým a poté pravým tlačítkem. Otevře se okno pro posun, označíme si vrtulník a tři edity pod Absolute:world vyplníme nulami:


Následuje oddělení rotoru od vrtulníku. V nějakém šikovném pohledu, nejspíš Front označíme vrtulník. Klikneme na záložku modify, následně Editable mesh / Element:


Tím můžeme manipulovat s vrtulníkem po jeho částech. Označíme listy rotoru a dále středovou část která k rotoru patří (pro vybrání více objektů použijeme Ctrl). Klikneme pravým tlačítkem a oddělíme od stávájícího objektu - Detach. Do okna ještě musíte napsat jméno nového objektu:


Do scény si přidáme ještě nějaké to světlo. Klikněte na záložku Lights&Cameras a Omni Light. Klikněte někam do scény a máte světlo. Jak jednoduché. Další parametry měnit nemusíte, pouze přes ikonu move můžete světlo podle potřeby přesunout na lepší místo.
Nyní je na čase přidat kameru kterou budeme vrtulník sledovat. Klikneme opět na záložku Lights&Cameras a na Target Camera.


Kameru vytvoříme způsobem aby sezhora sledovala vrtulník. V jednom ze spodních pohledů si můžete změnit pohled rovnou na Camera01, ať vidíte jak výsledek vypadá. To uděláme tek že klikneme na nápis Perspective nebo např. Left pravým tlačítkem a vybereme Views / Camera01:


V pohledu front se můžete podívat jak celá scéna vypadá. Zelený je vrtulník, modrá kamera a ta žlutá tečka je světlo:


Samozřejmě si můžeme kdykoliv scénu vyrenderovat, abychom viděli jak to celé vypadá, pro ty co nevědí pouze zopakuji Rendering / Render - Render.
Již se dostáváme k tomu, že si vyrenderujeme konečný vrtulník (bez rotoru) do konečného programu. Nejprve ale musíme skrýt rotor. Stačí na něj kliknout pravým tlačítkem, dát Properites a odškrtnout Renderable. Přepneme do pohledu Camera01, a dáme dialog Rendering / Render. Zde si zvolíme výslednou velikost Output size na 140x140 pixelů a odškrtneme Antialiasing ! (to je důležité). Poté jen dáme Render a pokud se vše povedlo, vyleze na svět obrázek podobný tomuto:


Pokud nejsou vydět pořádně lyžiny stačí si chvíli pohrát v malování. Když jsme už u renderování, uděláme také další dvě polohy vrtulníku, a to vrtulník nahnutý doleva a doprava. Snad již nemusím popisovat že použijeme nástroj Rotate, rotoval jsem na každou stranu o deset stupňů:


Nyní se dostáváme k tvorbě rotoru. Jak jistě každý ví, rotor se dočí opravdu rychle, tudíž máme možnost udělat program který bude mít 300FPS a vždy jej otočíme o pár stupňů, nebo druhá možnost, že se bude pomalu otáčet rozmazaná vrtule, jak to můžeme vidět například ve filmech.
První věc kterou uděláme je že skryjeme vrtulník podobně jak jsme skryli rotor a ten naopak zobrazíme.
Dále přichází na řadu animace vrtule. Posuneme spodní posuvník na pozici 45, a klikneme na velké tlačítko Animate. Celá plocha se podsvítí červeně čímž nás informuje o tom že cokoliv nyní uděláme způsobí přidání klíčového snímku. My klikneme na rotor a rotujeme jej o 360° ;) Opět klikneme na tlačítko animate a toť vše:


Pokud nyní vyrenderujeme scénu (zapněte si antialiasing !!), budeme nepříjemně překvapeni. Na obrázku je pouze černá čárka, žádné rozmazání se nekoná. To si totiž musíme zapnout. Klikneme na kameru a poté na záložku modify. Najdeme Multi-Pass Effect a zapneme Motion Blur. Parametry jsou vidět na tomto obrázku:


Nyní již výsledek renderování vypadá úplně jinak. Vyrenderujeme tedy dostatečný počet snímků za sebou, uložíme a slepíme k sobě. Pokud máme černou vrtuli na bílém pozadí, musíme dát ještě negativ, jelikož stín po vrtuli se bude kreslit tam, kde je plocha bílá. Zde je konečný výsledek, po kliknutí se zobrazí celý obrázek:


A je to. Máme vrtulník, máme vrtuli. Konečně můžeme maxko zavřít a udělat poslední věc související s grafikou - přední světlo. K tomu nám poslouží například photoshop, vytvoříme nový obrázek s bílým pozadím a zvolíme Filter / Render / Leghtning effect. Parametry jsou zde:


A výsledek:


Programování

Obrázky máme všechny a tak nám už vůbec nic nebrání v programování.
Spustíme Delphi, vytvoříme nový projekt a na formulář přidáme komponenty DXDraw, DXImageList, DXTimer a DXInput. Velikost DXDraw nastavíme podle velikosti pozadí. Dále otevřeme DXImageList1.Items a postupně vložíme všechny obrázky (v závorce jsou uvedeny jména - name): pozadí (back), rotor (vrtulka), svetlo (svetlo), vrtulník (vrtulnik_0), vrtulník nahnutý doprava (vrtulnik_1) a vrtulník nahnutý doleva (vrtulnik_2). Dále si definujeme nějaké ty proměnné:


    r:integer;     // část rotoru která se má zobrazit
    x,y:integer;   // pozice vrtulníku
    velx,vely,     // rychlost x a y
    incy,incx:real;// zrychlení v obou směrech
    spin:integer; // natočení vrtulníku do strany


A tyto proměnné si rovnou nastavíme v proceduře OnCreate:

procedure TForm1.FormCreate(Sender: TObject);
begin
 x:=200;
 y:=200;
 incx:=2;
 incy:=2;
end;


A zde je kompletní výpis procedury OnTimer:

procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
// update klavecnice
 DXInput1.Update;
 // podle klávesnice přičteme / odečteme
 // od rychlostí vely a velx
 // zrychlení incx a incy
 with DXInput1.Keyboard do
  begin
  if isUp in States then
    vely:=vely-incy;
  if isRight in States  then
    velx:=velx+incx;
  if isLeft in States  then
    velx:=velx-incx;
  if isDown in States  then
    vely:=vely+incy;
  end;

 // zpomalení
 velx:=velx/1.2;
 vely:=vely/1.2;

 // vypočteme novou pozici x a y
 x:=Trunc(x+velx);
 y:=Trunc(y+vely);

 // kreslení pozadí
 DXIMageList1.Items.Find('back').Draw(DXDraw1.Surface,0,0,0);

 // kreslení předního světla
 DXIMageList1.Items.Find('svetlo').DrawAdd
 (DXDraw1.Surface,rect(x-17,y-140,x+13,y-40),0,200);

 // výpočet nahnutí vrtulníku
 // (podle toho jak rychle letí
 // do stran...
 if velx > 3 then spin:=1 else
 if velx < -3 then spin:=2 else
 spin:=0;
 // kreslení vrtulníku
 DXIMageList1.Items.Find('vrtulnik_'+IntToStr(spin)).DrawRotate
 (DXDraw1.Surface,x,y,140,140,0,0.5,0.5,0);

 // kreslení rotoru
 DXIMageList1.Items.Find('vrtulka').DrawSub(DXDraw1.Surface,
 Rect(x-70,y-70,x+70,y+70),r,200);
 // otočení o další obrázek..
 Inc(r);
 if r = 15 then r:=0;

 // zobrazení FPS, a rychlosti
 with DXDraw1.Surface.Canvas do
  begin
   Font.Color:=clYellow;
   Font.Name:='Tahoma';
   Font.Size:=8;
   Brush.Style:=bsClear;
   TextOut(3,3,'FPS: '+IntToStr(DXTimer1.Framerate));
   TextOut(3,18,'VelX: '+FloatTOStrF(velx,ffFixed,7,5));
   TextOut(3,33,'VelY: '+FloatTOStrF(vely,ffFixed,7,5));
   // !!
   release;
  end;

 // a to je vše ;)
 DXDraw1.Flip;
end;


Nyní je na čase si vysvětlit co vlastně děláme. Nejdřív obnovíme DXInput abychom dostali aktuální stav klávesnice, poté podle stisknutých kláves přičteme odečteme od aktuální rychlosti zrychlení. Na tuto rychlost následně aplikujeme zpomalení tím že ji vydělíme 1,2. Rychlost přičteme k aktuální pozici vrtulníku a získáme tak novou pozici, na kterou vykreslíme všechny potřebné prvky - nejdřív pozadí, následuje světlo, potom samotný vrtulník a kreslení zakončuje rotor. A to je vše. Opravdu jednoduché. Zde je malá ukázka zrychlení na grafu, navíc s rúznými hodnoty zpomalení. Je vidět že čím víc se blížíme jedné (něco děleno jedna je samozřejmě původní hodnota), tím prudší je graf a tím větší maximální rychlosti dosáhne:


Článek jako obvykle zakončíme náhledem na samotný program ;)


Závěr

Ovšem článek ještě nekončí. Pár slov nakonec nikdy neuškodí. O čem ? Inu, stačí se podívat na FPS a hned je to jasné. Program je pomalý ! Proto by neškodila menší či větší optimalizace, jak výpočtů tak kreslení. To už ale nechám na vás, já jsem si svůj program zoptimalizoval do podoby že mám něco okolo 97FPS a navíc jsem ještě přidal nové módy kreslení vrtule. Zde je malý náhled, nevěřící najdou v downloadu odkaz na zabalený exe soubor aby se mohli přesvědčit sami. A zkoušek a zkoušet ;) Kreslení je šest druhů, stín (jako v předešlén případě), zesvětlení, overlay, trochu vylepšený overlay, odstíny šedi a nakonec negativ. Zde je slíbený náhled:


Download
ZDE si můžete stáhnout zdrojáky dnešního programu. Jako bonus najdete v archivu i vyrenderovaný vrtulník i s vrtulí, vyhlazený. (550kB)

ZDE je zabalený optimalizovaný program s více druhy kreslení. (670kB)



Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: