× Aktuálně z oboru

Vychází Game Ready ovladače pro Far Cry 5 [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]
Celá zprávička [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]

Začínáme s DelphiX - 2. díl

[ http://programujte.com/profil/20356-jan-gruncl/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/20356-lucie-z/ ]Google [ ?rel=author ]       11. 11. 2005       12 566×

Tentokrát si v seriálu procvičíme dvě zajímavé metody vykreslování - StretchDraw a DrawAlpha.

Vykreslování v DelphiX

Díl druhý – Roztažení do obdélníku a kreslení s průhledností

Po zdlouhavém prvním dílu se dáme rovnou na věc a ukážeme si další dvě užitečné metody vykreslování. Tentokrát to bude StretchDraw, který nám přizpůsobí obrázek čtverci, resp. obdélníku, jaký si definujeme a kreslení s Alpha průhledností. Tak hurá do toho a půl je hotovo.

Roztažení do obdélníku
Toto je velmi užitečná věc, pokud chcete například zobrazit pulzující srdíčko signalizující život v nějaké plošinovce, apod. Zkrátka a jednoduše můžete mít libovolně veliký obrázek a ten průběžně zvětšovat či zmenšovat podle Vašich potřeb (i když, s tím zvětšováním opatrně, lepší je mít obrázek v největší variantě a pouze ho zmenšovat, tak se vyhnete nepříjemnému rozmazání). Rozeberme si tedy příkaz:

TDXImageList.Items[x].StretchDraw (plocha, obdélník, část obrázku);

plocha: To už známe, o čem jsem už mluvil, budu nyní vypouštět.
obdélník: Sem si dosadíme název obdélníku, do kterého budeme kreslit. My si ho pojmenujeme „obdelnik“.

Náš příkaz tedy vypadá takto:


dximagelist1.Items.find('DelphiX').StretchDraw(dxdraw1.surface, obdelnik, 0); // v případě, že chceme vykreslit obrázek s názvem „DelphiX“ do obdélníku „obdelnik“

resp. takto (druhou variantu budu pro příště také vynechávat - myslím, že je to jasné):


dximagelist1.Items[0].StretchDraw(dxdraw1.surface, obdelnik, 0);

Zkuste si program zkompilovat; pravděpodobně Vám bude hlásit, že „obdelnik“ je nesmysl. To není divu, protože jsme žádný nevytvořili. Tak to změníme. Definujte si tedy globální proměnnou obdelnik, která bude typu TRect (pro ty, co v Delphi neumí vůbec nic: uděláte to příkazem „obdelnik: Trect;“ - bez uvozovek - který vložíme před příkaz „implementation,“ za příkaz „var“, který určuje definici proměnných) a programově si určíme rozměry obdélníku hned na spuštění programu (tyto hodnoty se týkají mého obrázku, vy si je přizpůsobte):


procedure TForm1.FormCreate(Sender: TObject);
begin
	obdelnik.Left:=10; // určí vzdálenost levého okraje obdélníku od levého okraje dxdraw
	obdelnik.Top:=10; // určí vzdálenost horní strany
	obdelnik.Right:=212; // vzdálenost pravého okraje obdélníku od levého okraje dxdraw (nikoli od levého okraje obdélníku, na to pozor!)
	obdelnik.Bottom:=94; // vzdálenost spodní strany (platí totéž jako u „obdelnik.Right“)
end;

A pustíme se do kreslení. Zkusíme si rovnou něco, kde se projeví funkčnost příkazu. Obrázek se bude roztahovat na polohu myši tím, že se pravý dolní roh přizpůsobí poloze myši. Opět použiji „-form1.left“ a „-form1.top,“ abych ošetřil vzdálenost okna od okrajů plochy. Ovšem pozor! Zatímco zvětšovat obrázek si můžete do aleluja, se zmenšováním to není tak jednoduché, když to přeženete, začnou se objevovat nesmysly (to je vidět i v mém příkladu). Tomu se dá předejít pomocí vypočítávání obrázku a ukládání do DIBu, ale to je záležitost pro můj seriál příliš komplikovaná a nemá s příkazem StretchDraw vůbec nic společného, takže nevidím důvod, proč to sem psát. Nejjednodušší je zkoušet si, kam až je možno zajít, metodou pokusu a omylu. Ale tady už je finální procedura onTimer:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.fill(0);
	obdelnik.Right:=mouse.cursorpos.x-form1.left; // spočítá vzdálenost pravé strany s přihlédnutím k poloze okna
	obdelnik.Bottom:=mouse.cursorpos.y-form1.top; // spočítá vzdálenost spodní strany s přihlédnutím k poloze okna
	dximagelist1.Items.find('DelphiX').StretchDraw(dxdraw1.surface, obdelnik, 0); // vykreslí na obdélník obrázek
dxdraw1.flip;
end;

Tentokrát si už program zaslouží zdrojový kód ke stažení [ http://programujte.com/file.php?id=58_1131482475_stretch ] (v Delphi 5).
Jinak, zkuste si za domácí úkol zkusit to výše zmiňované pulzující srdíčko. Věřím, že to nebude pro většinu z Vás problém.

- A tady jsou obrázky


obr. 1, 2: obrázek přizpůsobený obdélníku


obr. 3, 4: takhle to může vypadat, když to přeženete se zmenšováním do některého ze směrů

- Kreslení s průhledností
Tak tohle bude o něco stručnější, neboť problematiku s obdélníkem již umíme (roztažení do obdélníku je vlastnost skoro všech vykreslovacích metod). Aby si někteří z Vás doplnili mezeru ve vzdělání, můžu Vám prozradit, že průhlednosti, se kterou budeme pracovat, se říká Alpha [alfa] průhlednost. Ten příkaz se podle toho také jmenuje, takže je dobré si to pamatovat. Praktické využití si doufám dovedete představit, takže jdu rovnou na věc. Tady je příkaz (nezapomeňte si vytvořit obdélník):

TDXImageList.Items[x].DrawAlpha(plocha, obdélník, část obrázku, index průhlednosti);

index průhlednosti: Sem si dosadíme číslíčko od 0 do 255 (resp. proměnnou, která toto číslo obsahuje), které nám určí, jak moc bude obrázek průhledný (0-neviditelný, 255-neprůhledný).

A teď konkrétně:


dximagelist1.Items.find('DelphiX').DrawAlpha(dxdraw1.surface, obdelnik, 0, 125); // průhlednost bude přibližně poloviční

Myslím, že k tomu není co dodat. Ukážeme si příklad, kde se pomalu zjeví obrázek. Nejprve si vytvořte proměnnou typu Integer jménem „alpha“, která bude určovat aktuální průhlednost. A nezapomeňte jí na onCreate formuláře nastavit hodnotu nula. Není to nutné (Delphi nastavují automaticky nulovou hodnotu), ale je to profesionálnější přístup. A tady je obsah procedury onTimer:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.fill(0);
	if alpha<255 then inc(alpha); // navýší hodnotu proměnné alpha při každém průběhu procedury, pokud ovšem není její hodnota větší nebo rovna 255
	dximagelist1.items.find('DelphiX').DrawAlpha(dxdraw1.surface, obdelnik, 0, alpha);
dxdraw1.Flip;
end;

Pochopitelně by nebyl problém udělat obrázek, který se průběžně skrývá a zase vynořuje, ale to už Vám nechám jako druhý domácí úkol.
A tady je zdrojový kód ke stažení [ http://programujte.com/file.php?id=58_1131482467_alpha ] (opět v Delphi 5).

- Tady jsou další obrázky


obr. 1, 2: průběh programu

A je to. Máte-li nějaké dotazy, pište na ICQ#299-545-993 (nebo raději do diskuze). Těším se na Vás u třetího dílu.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2005110803-zaciname-s-delphix-2-dil/ ].