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
Speciální grafické efekty v DelphiX
delphi_effects
20. září 2001, 00.00 | Zkuste si podle návodu v dnešním článku vytvořit zajímavé grafické efekty v DelphiX. Například kreslení obrázku pouze jako tisíce kruhů s průměrnou barvou nebo rozpixelovaný obrázek, který se postupně změní v logo !
Před nedávnem jsem psal o knize v Delphi v příkladech (článek si můžete přečíst zde). K této knize se ještě vrátím, jelikož mě inspirovala natolik, že jsem podle ní vytvořil zajímavé grafické efekty. Samozřejmě, jak je zvykem - v DelphiX. Abych předešel dlouhým diskuzím - program jsem z knihy neokopíroval, pouze jsem si půjčil nápad a ten potom zrealizoval. Ostatně - přesvědčte se o tom sami a knihu si kupte... Tedy, dáme se do programování.Průměrné barvy poprvé
Stejně jako ve výše jmenované knize se nyní pokusíme udělat program, který kreslí obrázek pouze pomocí náhodně umístěných kruhů dané velikosti. Abychom věděli, jakou barvou musíme daný kruh nakreslit, musíme si vypočítat průměrnou barvu okolních pixelů, které leží unitř kruhu. Musíme tedy sčítat každou složku barvy zvlášť (Red - červenou, Green - zelenou a Blue - modrou) a nakonec každou složku vydělik počtem testovaných pixelů. Pro nejlepší výsledek by bylo dobré testovat každý pixel v kruhu, to by však zabralo spoustu procesorového času, a to si nemůžeme dovolit. Proto budeme testovat pouze daný počet pixelů, který bude uložen v proměnné Pocet. To je vše, co musíme vědět a dáme se tedy už konečně do toho programování.
Začneme tím, že spustíme Delphi. Na formulář dáme komponentu Image, ve které bude obrázek, který chceme touto metodou nakreslit. Musíme si tedy nějaký nahrát. Například slunečnici, která byla použita v knize a pro tento účel hezky vyhovuje:
Máme obrázek, co dál ? Přidáme komponentu DXDraw, na kterou budeme kreslit a DXTimer, který se o kreslení postará. My si program ještě trochu rozšíříme, a to možností měnit velikost kruhů a počet testovaných pixelů. Dáme tedy na formulář ještě dvě komponenty Label a TrackBar. Jména můžete nechat defaultní. První TrackBar bude ovlivňovat velikost kruhu, nastavíme mu tedy Max na 5, Min na 2 a Position na 5. Druhý bude nastavovat počet testovaných pixelů, nastavíme mu min na 1, max na 10 a position opět 5. Labely umístíme někam nad komponenty.
Nyní je na čase definovat si pár proměnných - Poloměr kruhu bude uložen v proměnné Rad, počet testovaných pixelů v proměnné Pocet a krom kreslení se bude dát přepnout mezi kreslením kruhu a čtverců - k tomu bude sloužit proměnná CoKreslit. Tady to máte vše hezky pohromadě:
|
Rovnou si můžeme také vytvořit procedury TrackBar1.OnChange a TrackBar2.OnChange:
|
|
A už nám zbývá pouze procedura DXTimer.OnTimer. V ní budeme kreslit několik (1000) kruhů. Nejprve si nastavíme náhodnou pozici středu kruhu, která bude uložena v proměnných x a y. Dále si vynulujeme jednotlivé složky barvy - sr, sg a sb. Poté budeme podle veliksoti proměnné Pocet zjišťovat r, g a b složky pixelů uvnitř kruhu a přičítat je právě k proměnným sr, sg a sb. Až toto skončíme, všechny tři proměnné vydělíme proměnnou Pocet, čímž získáme průměrnou barvu a touto barvou nakonec nakreslíme kruh. A to je celé. Výpis procedury i s komentáři je zde:
|
Tím máme program hotov a můžeme jej rovnou přeložit a spustit. Jak vypadá vidíte zde (program kreslí každý kruh pořád na jiném místě, tudíž nakonec vznikne efekt animace, který je opravdu hezký :)
Pokud si nastavíte proměnnou CoKreslit na ctverce, vypadá efekt také zajímavě:
Průměrné barvy podruhé
V našem druhém příkladě se pokusíme o trochu něco jiného - budeme obrázek rozpixelovávat tak, jak to dělají grafické editory. Každý čtverec přesně pasuje k čtvercům okolním. Kreslit budeme od největšího k nejmenšímu, až se nakonec dostaneme k výslednému obrázku. Tento efekt se dá hezky použít například ve hře na začátku při zobrazování loga tvůrců. Pokud žádný obrázek nemáte zrovna při ruce, zde jeden je (není to logo žádné firmy, nakreslil jsem jej já ve photoshopu):
Spustíme delphi a můžeme otevřít minulý projekt. Do komponenty Image nahrajeme nový obrázek a podle nové velikosti nastavíme novou velikost DXDraw. Komponenty Label a TrackBar můžete vymazat, stejně tak jako všechny procedury a proměnné. Ty si definujeme trochu jiné a pouze dvě - RSize:integer ve které bude uložena velikost kresleného obdélníku (nastavíme na začátek na 50) a Pocet:integer definující počet testovaných pixelů (na začátek nastavíme na 25).
Nyní se již můžeme vrhnout na proceduru DXTimer.OnTimer. Kód je přibližně stejný jako u minulého příkladu, pouze zmenšujeme velikost proměnných RSize a Pocet. Pokud se dostaneme s velikostí čtverce na 2 pixely, nekreslíme čtverec, ale jednoduše kopírujeme obrázek z komponenty Image. A to je opravdu celé. Zde je výpis procedury:
|
Program můžete přeložit, spustit a sledovat, jak se hezky mění zprvu pár čtverců na hezké logo. Zde je pár screenshotů chvíli po sobě:
A to je pro dnešek opravdu vše.
Download
Zde si můžete stáhnout dnes vytvořený příklad a zdrojáky (210 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