Je tu další díl seriálu, tentokrát na kombinované metody vykreslování.
Vykreslování v DelphiX
Díl čtvrtý – kombinované příkazy a výpočet pro zarovnání na střed
Po trochu náročnějším třetím díle přicházím s něčím oddychovějším. Ti zvídavější z Vás, nebo ti, kteří mají zapnutý autocomplete (automatické doplnění příkazu), si jistě všimli, že DelphiX nabízí příkazy DrawRotateAlpha a DrawWaveXAlpha (DrawAdd, DrawSub a jejich kombinace si popíšeme v některém z příštích dílů, jsou totiž také velmi zajímavé, ale zatím je nepotřebujeme). Ti chytřejší už přišli na to, k čemu vlastně slouží. Jejich popis nám nezabere příliš místa, ale dnešní poněkud krátký článek si plně vynahradíme příštím dílem, který bude celkem dlouhý, a jeho obsah bude opravdovým bonbónkem pro ty, kteří nemají s programováním zkušenosti. Ale nechte se překvapit, dneska je náplň jiná. Ale trochu místa si vyplníme alespoň jedním důležitým výpočtem, který se v práci s grafikou hodí.
Otáčení obrázku s průhledností
Výpočty spojené s otáčením jsme si vytrpěli už minule, takže dneska jen stručný rozbor příkazu:
TDXImageList.Items[x].DrawRotateAlpha(plocha, pozice_x, pozice_y, šířka, výška, část obrázku, střed_x, střed_y, úhel, index průhlednosti);
Tady není co vysvětlovat, vše už umíme z minulých dílů. Jenom opět přidám příklad:
dximagelist1.Items.find('DelphiX').DrawRotateAlpha(dxdraw1.surface, 200, 200, 202, 84, 0, 0.5, 0.5, 32, 125); // obrázek otočený o 45 stupňů s poloviční průhledností
A jak jsem slíbil, tak jsem splnil. Toto bylo velice jednoduché a abych Vám udělal radost, další příkaz na tom bude v tomto směru stejně.
Zvlnění s průhledností
A máme tu další příkaz. Tentokrát to bude mé oblíbené zvlnění, ovšem s průhledností.
TDXImageList.Items[x].DrawWaveXAlpha(plocha, pozice_x, pozice_y, šířka, výška, část obrázku, amplituda, šířka_vlny, perioda, index průhlednosti);
Kdo to říkal? Já jsem to říkal! Je to snadné. A ještě příklad, jako vždy:
dximagelist1.Items.find('DelphiX').DrawWaveXAlpha(dxdraw1.surface, 33, 33, 202, 84, 0, 5, 30, 0, 150); // zvlněný obrázek s poloviční průhledností
Výpočty pro vycentrování
Jistě jste si všimli, že všechny naše obrázky jsou jen tak pohozeny více či méně v levém horním rohu. Ale velmi často budeme potřebovat zarovnání přesně doprostřed obrazovky. A dneska si to ukážeme pomocí operátoru div, což je to stejné, jako / (lomítko) – slouží tedy pro dělení, ale s tou výjimkou, že se jedná o dělení celočíselné (nebo, chcete-li, se zbytkem). Případný zbytek se pak spočítá pomocí mod, ale to už je jenom pro zajímavost. Takže si ukažme výpočty:
V případě, že chcete určit pouze střed otáčení u příkazu DrawRotate a odvozených, je výpočet jednoduchý:
x:=dxdraw1.Width div 2; // přiřadí x polovinu šířky dxdraw
y:=dxdraw1.Height div 2; // přiřadí y polovinu výšky dxdraw
Pokud ale potřebujeme určit levý a horní okraj, jak tomu je u Draw a DrawWaveX (a samozřejmě odvozených), je to maličko složitější. Musíme totiž ještě odečíst polovinu obrázku. Totéž samozřejmě platí i pro výpočet levé a horní strany obdélníku, který používáme pro StretchDraw a DrawAlpha.
x:=(dxdraw1.Width div 2) - (dximagelist1.items.Find('DelphiX').Width div 2); // od poloviny šířky dxdraw odečteme ještě polovinu šířky obrázku
y:=(dxdraw1.Height div 2) - (dximagelist1.items.Find('DelphiX').Height div 2); // od poloviny výšky dxdraw odečteme polovinu výšky obrázku
Je to vlastně úplně logické. Normální matematika. Vidíte, že je občas i užitečná. Teď si uděláme jenom jednoduchý prográmek, který na prostředku formuláře otočí pomalu se zjevující obrázek o 360 stupňů a poté ho natrvalo zastaví. Budeme potřebovat Integery x, y a index, kde index bude určovat průhlednost a zároveň natočení. Nezapomeňte jim na začátek programu přiřadit správné hodnoty (pro x a y to bude to, co jsem Vás právě naučil, a pro index jako vždy nula). A zde je obsah procedury onTimer i s komentáři:
procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.Fill(0);
if index<256 then inc(index); // pokud je index roven 255 nebo menší, navyš ho o jeden
dximagelist1.items.Find('DelphiX').DrawRotateAlpha(dxdraw1.surface, x, y, 202, 84, 0, 0.5, 0.5, index, index); // a nakreslíme to
dxdraw1.flip;
end;
To je vše. Myslím, že obrázky nejsou třeba. Tady je zdrojáček v Delphi 5.
Tímto končím tento díl. Dotazy prosím pište na ICQ 299-545-993, nebo jako příspěvek do diskuze. A příště se můžete těšit na velice zajímavý díl, který nám vynahradí ten nepříjemně zkrácený dnešní. Zkusíme si konečně něco naprogramovat, ale víc neprozradím. Tak zase příště!
P.S.: Omluvte celkovou slohovou stránku. Psal jsem to už před dlouhou dobou a nepřepisuju to po sobě. Děkuju za pochopení.