Simulace sněžení - 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:



Delphi

Simulace sněžení

delphi_snih

8. ledna 2001, 00.00 | Není venku sníh? A chcete mít sníh alespoň virtuálně? Praktická ukázka, jak si udělat malou sněhovou vánici v Delphi.


Jelikož je zima a někde, tedy na horách, určitě sněží, podíváme se dnes v našem článku právě na sněžení.
Princip je velice jednoduchý - na pozadí nakreslíme nějaký obrázek a přes něj vykreslujeme letící sněhové vločky. Existují v podstatě dva způsoby padání sněhových vloček.
  • Buďto budou sněhové vločky padat na sebe, a na spodu obrazovky vytvářet "kopce" sněhu,
  • nebo druhý způsob, který si dnes ukážeme, a to takový, že vločky na spodu obrazovky mizí.
Popis postupu

Jak jste již asi z nadpisu poznali, budeme vykreslovat přes komponenty DirectX a proto si hned po vytvoření nového projektu dáme na formulář DXdraw, DXTimer a DXImageList. DXImageList jednak proto, že budeme na pozadí kreslit obrázek, a také proto, že tentokrát nebudeme jako vločky používat pixely, ale již rovnou nakreslené obrázky.
Tedy, nejprve seženeme nějaký ten hezký obrázek zasněžené krajiny a poté nakreslíme např. v malování 3 obrázky sněhové vločky. Zvolil jsem obrázky rozměrů 1x1, 2x2 a 3x3 pixely, které zvládne nakreslit snad každý.
A nyní k programu. Princip je jednoduchý. Vytvoříme proměnnou Kulicka typu TPoint, ve které bude uložena pozice sněhové vločky, dále KulickaSpeed, ve které bude uložena rychlost, o kolik pixelů vločka spadne dolů a KulickaSize, určující právě velikost vločky. Samozřejmě asi nebudeme chtít pouze jednu vločku, a proto vytvoříme všechny proměnné jako pole. Poté přidáme ještě konstantu MaxSnehu, která určuje, kolik bude najednou vloček a SnihCounter, který bude ukazovat na vločku, jejíž parametry máme zrovna měnit. Celé toto přidáme do proc. DXTimer.OnTimer, přičemž ještě zmenšíme Interval timeru a výsledek by mohl vypadat nějak takto:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var i:integer;
begin
if not DXdraw1.CanDraw then exit;

// nakreslit pozadí
DXImageList1.Items[3].Draw(DXdraw1.surface,0,0,0);

SnihCounter:=SnihCounter+1;
if SnihCounter = MaxSnehu then SnihCounter:=0;
Kulicka[SnihCounter].x:=Random(DXDraw1.surfacewidth);
Kulicka[SnihCounter].y:=0;
KulickaSpeed[SnihCounter]:=Random(15)+2;
KulickaSize[SnihCounter]:=Random(3);

for i:=0 to MaxSnehu do
begin
Kulicka[i].y:=Kulicka[i].y+KulickaSpeed[i];
if Random(5)=4 then Dec(Kulicka[i].x,1)
else if Random(5)=3 then Inc(Kulicka[i].x,1);
DXImageList1.Items[KulickaSize[i]] .Draw(DXDraw1.surface,
Kulicka[i].x,Kulicka[i].y,0);
end;

DXdraw1.Flip;
end;


Pokud si následující text pečlivě přečtete, zjistíte, že jsem přidal ještě dva řádky, které zajistí, aby se někdy vločka pohla trochu vlevo či vpravo a vypadalo to, jako že slabě fouká vítr. Pokud se Vám zdá, že se vločky málo "třesou" a letí přímo k zemi, stačí změnit hodnoty. Na optimální nastavení již určitě přijdete sami.

A to je asi vše. Ještě podotknu, že je dobré nedávat moc světlé pozadí, jelikož na něm bílé vločky velice snadlo zaniknou a nemá to ten správný efekt. 

Download
ZDE si můžete stáhnout program a zdrojáky (706 kB)

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

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

 

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

Uživatelské jméno:

Heslo: