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
TurboPixels aneb rychlé pixely v DelphiX
delphix_turbopixels
25. září 2001, 00.00 | Chcete ve hrách v DelphiX používat rychlý přístup přes pixely, kreslit pixely s alpha průhledností, vyhlazené čáry nebo třeba text z WinAmpu ? Přečtěte si recenzi unity TurboPixels, která toto vše umí !
Vadí vám, že standartní funkce windows "pixels" je pomalá, a tudíž celkem nepoužitelná ve hrách či v programech v DelphiX ? Nebo prostě jenom potřebujete kreslit pixely s alpha průhledností a čáry s vyhlazením ? Tak právě pro vás je tu unita TurboPixels pro DelphiX !
Tato unita vznikla právě pro potřebu rychlého přístupu k pixelům a její použití je více než jednoduché. Nejprve musíte samozřejmě přidat do uses TurboPixels. Dále v proceduře kreslení, nejspíš DXTimer.OnTimer musíte zamknout povrch pro kreslení. To uděláte přes proceduru LockSurface(surface); První a zároveň jediný parametr musí být povrch, na který chcete kreslit (např. DXDraw1.Surface). A můžete se dát do kreslení. Zde je výpis všech nejpoužívanějších funkcí:
Nastavení pixelu - SetPixel
Začněme tedy pouhým nastavením pixelu na určitou barvu. Velkou roli při kreslení hraje aktuální barevná hloubka, kterou musíme nejprve otestovat, a podle ní kreslit (je uložena v dxdraw.Surface.BitCount). Navíc je v unitě pro každou hloubku ještě víc procedur, pár jich využívá assembler, pár ne. Pro kterou se rozhodnete je už jen a jen na vás:
Barevná hloubka 8bitů (256 barev):
procedure turboSetPixel8(const X, Y: Integer; color: byte);
procedure turboSetPixel8A(const X, Y: Integer; color: Integer);
procedure turboSetPixel8PC(x, y, color: integer);
Barevná hloubka 16 bitů
procedure turboSetPixel16RGB(const X, Y: Integer; R, G, B: byte);
procedure turboSetPixel16(const X, Y: integer; color: cardinal);
procedure turboSetPixel16A(X, Y: Integer; color: cardinal);
procedure turboSetPixel16PC(x, y, color: integer);
Barevná hloubka 24 bitů
procedure turboSetPixel24RGB(const X, Y: Integer; R, G, B: byte);
procedure turboSetPixel24(const X, Y: integer; color: cardinal);
procedure turboSetPixel24A(X, Y: Integer; Color: cardinal);
procedure turboSetPixel24PC(x, y, color: integer);
Všechny procedury jsou opravdu rychlé, což si můžete vyzkoušet hned na přiloženém demu, které je součástí archivu. První demonstrační příklad ukazuje pouze nastavování náhodných pixelů, čímž vzniká efekt zrnění:
Na mém PC se při rozlišení 1024*768 kreslil pruh pixelů vysoký 100pixelů. To znamená při každém vykonání procedury Timeru se kreslilo 102400 pixelů. Při tomto rozlišení dosahoval program 20FPS, z čehož lehce vypočteme, že TurboPixels zvládnou nakreslit něce málo přes dva miliony ! pixelů za sekundu. A to je už opravdu fofr (možná to bude taky trochu tím, že mám PC Athlon 1GHz, 384MB RAM a GeForce2 :)).
Zjištění pixelu - GetPixel
Další často používanou věcí je zjištění barvy pixelu na určitě pozici. Stejně jako u předchozího, i zde je pro každou barevnou hloubku jiná funkce:
Barevná hloubka 8 bitů
function turboGetPixel8(const X, Y: Integer): byte;
function turboGetPixel8PC(x, y: integer): integer;
Barevná hloubka 16 bitů
function turboGetPixel16(const x, y: Integer): cardinal;
function turboGetPixel16PC(x, y: integer): integer;
- zjištění jednotlivých složek barvy:
function r16(color: cardinal): byte;
function g16(color: cardinal): byte;
function b16(color: cardinal): byte;
Barevná hloubka 24 bitů
function turboGetPixel24(const x, y: Integer): dword;
function turboGetPixel24PC(x, y: integer): integer;
- zjištění jednotlivých složek barvy:
function r24(color: cardinal): byte;
function g24(color: cardinal): byte;
function b24(color: cardinal): byte;
Opět můžete spustit demontrační příklad a vybrat z menu druhou položku (a samozřejmě nastavit rozlišení):
V tomto případě je nastaven pixel obrázku podle některého okolního pixelu, čímž vzniká zajímavý efekt. Jako minule i v tomto případě je program velmi rychlý.
Kreslení pixelu s alpha průhledností
I rychlé kreslení s alpha průhledností není díky TurboPixels problém. Je to sice již trochu pomalejší, ale stále několikrát rychlejší než windowsovské "pixels". Zde jsou procedury které můžete použít:
procedure turboSetPixelAlpha16(const X, Y: Integer; color: cardinal; A: byte);
procedure turboSetPixelAlpha24(const X, Y: Integer; color: cardinal; A: byte);
procedure turboSetPixelAlpha16RGB(const X, Y: Integer; R, G, B, A: byte);
procedure turboSetPixelAlpha24RGB(const X, Y: Integer; R, G, B, A: byte);
A rovnou se vrhneme na demo. Ve třetím případě je zobrazován obrázek turbo, a nad ním s měnící se alpha průhedností šum:
Kreslení vyhlazených čar
Dalším neskutečně velkým problémem je to, že delphiX ani windows nepodporují vyhlazené (antialiasingované) čáry. Ani toto však není pro TurboPixels problém. Použít můžete tyto procedury:
procedure turboWuLine16(x1, y1, x2, y2: Integer; R, G, B: byte);
procedure turboWuLine24(x1, y1, x2, y2: Integer; R, G, B: byte);
Pokud chcete přeci jenom nevyhlazené čáry, vynechte kouzelné slovo Wu:
procedure turboLine16(x1, y1, x2, y2: Integer; R, G, B: byte);
procedure turboLine24(x1, y1, x2, y2: Integer; R, G, B: byte);
K předvedení možností vám poslouží poslední příklad v demonstračním programu:
Kreslení WinAmp textu
Další specialitkou, kterou v unitě naleznete je kreslení WinAmp textu. Stačí si tento text z nějakého skinu nahrát do DXImageListu, nastavit PatternHeight na 6 a PatternWidth na 5 a zavolat proceduru TurboWrite. Zde jsou její parametry:
procedure turboWrite(DxDrawSurface: TDirectDrawSurface; Imagelist: TDXImageList; font, text: string; x, y: integer);
- DXDrawSurface - povrch na který se bude kreslit
- ImageList - DXImageList, ve kterém je uložen obrázek s písmem
- Font - jméno písma v DXImageListu
- Text - text, který chcete napsat
- X,Y - pozice textu
Takže rychle prohlédněte všechny skiny WinAmpu, a hned můžete nějaké to písmo použít. Pokud se vám zdá, že máte obrázků málo, zde jich pár je:
Pár slov nakonec...
!!! Pozor !!!, po ukončení kreslení musíte povrch zase odemknout přes proceduru TurboUnlock, která je již bez parametrů.
Nakonec vám ještě řeknu, že tímto článkem s TurboPixels nekončíme, ale právě naopak. Chystám pro vás totiž například článek o Particle Systems (částicové systémy):
Nebo o zobrazení a rotaci jednoduché 3d kostky:
A právě u těchto příkladů hezky využijeme možnosti, které nám TurboPixels nabízí.
Download
Zde si můžete unitu stáhnout i s demo příkladem.
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