× 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 - 1. díl

[ http://programujte.com/profil/20356-jan-gruncl/ ]Google [ ?rel=author ]       zatím neprovedena       12. 9. 2005       17 868×

Toto je první část seriálu o programování v DelphiX pro naprosté začátečníky. Skutečně každý nezkušený programátor si nyní může napsat nějakou aplikaci pod DirectX, aniž by kdy napsal jediný řádek v C++. Seriál byl původně psán pro GameCode, ale vzhledem k přístupu administrátorů k redaktorům (a zrušení webu) jej budu postupně přesunovat sem. Doufám, že ho oceníte tak, jako dříve čtenáři GameCode.

Vykreslování v DelphiX

- Základy v DelphiX a standardní vykreslování

Tento seriál je zaměřen na úplné začátečníky, a podle toho také vypadá. Takže pokud si tento článek otevřel nějaký pokročilý programátor, nechť se neděsí českých překladů a zjednodušených vysvětlivek, které mají tuto problematiku zjednodušit. Ostatně zkušený programátor tady moc nezíská. Také se omlouvám za zdlouhavý začátek, ale jak jsem již řekl. Musím těm, co v DelphiX (resp. Delphi) začínají, vysvětlit podrobnosti. Ti, co už v DelphiX umí, a zajímají je jen zajímavé metody vykreslování, jako vlnění, otáčení, průhlednost apod., nechť přeskočí první dvě části prvního dílu, a možná i celý tento díl. Ale začněme.

- Potřebné komponenty
Prozatím se spokojíme s DelphiX. Nic dalšího potřebovat nebudeme. Už je také na světě verze, která podporuje 3D akceleraci (jmenuje se UnDelphiX) - vzhledem k rychlosti DelphiX při používání speciálních metod vykreslování je to přinejmenším vhodné. Komponentu lze stáhnout zde [ http://programujte.com/file.php?id=58_1126377058_undelphix_w_hw_v6 ]; pokud již odkaz nefunguje, odkáži Vás na nějaký vyhledávač, třeba Google, který tuto komponentu ochotně vyhledá.

- Sjednocení vzhledu a základní vlastnosti komponent
Aby později nedošlo k nedorozumění, určíme si, jak bude vypadat náš formulář. Toto sestavení budu používat ve všech dílech tohoto seriálu; pokud tomu bude jinak, upozorním na to. Nejprve si přizpůsobíme formulář. Jelikož v DirectX se pracuje v 90% případů ve fullscreenu, ořežeme si pro naše potřeby formulář pouze na vykreslovací plochu, abychom se později nemuseli zabývat zbytečnými výpočty. V object inspectoru (ten panel vlevo) si tedy přepneme položku BorderStyle na bsNone a nastavíme si šířku (width) třeba na 640px a výšku (height) tedy pochopitelně na 480px. Teď vložíme na formulář komponentu DXDraw, což je plocha na kterou budeme kreslit. Tu posuneme na souřadnice 0,0 a nastavíme jí stejné rozměry jako formuláři. Potom si položku Display změníme na „640x480x16“, čímž zajistíme 16 bitové barvy a rozlišení vhodné pro naše okénko. Není problém nastavit si barvy 24 bitové, nebo 32 bitové změnou posledního čísla. Pokud chcete 256 barev, napište osmičku. Další, co budeme potřebovat, je časovač, který nám provede co nejčastěji vykreslení. Pro DX je určen rychlý DXTimer. Vložíme si ho tedy na formulář a nastavíme mu Interval na nulu, čímž dosáhneme nejrychlejšího možného vykreslování. A jelikož pracujeme s obrázky, vložíme si na formulář komponentu DXImageList, která nám bude grafiku „skladovat.“ Nezapomeňte nastavit DXDraw na ten, se kterým budeme pracovat (toto jsem nikdy nepochopil, protože se u každého obrázku stejně tento atribut zadává, ale musí to tak prostě být). A poslední, co uděláme než začneme pracovat, je uložení obrázku do DXImageListu. Dvakrát tedy klikněte na TPictureCollection u položky Items. V zobrazeném okně klikněte na „Add new,“ v object inspectoru si napište název položky (pro naše potřeby zkusme „DelphiX“) a dvojklikem na none u položky Pictures jí přiřaďte obrázek (vyberte bitmapu, s JPG neumí DX přímo pracovat, a postup se mi nechce popisovat). A je hotovo.

- Nutné základy
Nejprve si ukážeme, co musí bezpodmínečně každý program v Delphi X obsahovat. Vše, o čem tu budu psát se řadí do procedury onTimer komponenty DXTimer, na to si dejte majzla, protože standardní na DXTimer je procedura onActivate, a ta by byla pro naše účely k ničemu. A jdeme na kód! Do onTimer musíme zařadit následující řádky:


if not dxdraw1.CanDraw then exit; // ošetří chyby při vykreslování – toto je velmi důležité, pracujete-li např. s canvasem, můžete se vyhnout chybě Access Violation
dxdraw1.Surface.fill(0); // pokryje plochu před kreslením černou barvou – zkuste to vynechat a pochopíte
.
. // tady bude zdrojový kód programu
.
dxdraw1.flip; // tohle bude úplně na konci, vykreslí vše na plochu – to je největší výhoda DX, že vykreslí vše najednou, a zbaví se tak onoho problikávání známého z rychle překreslovaných obrázků

- Standardní vykreslování
A konečně jsme se prokousali k účelu tohoto článku. Odpusťte mi, prosím, ten vláčný začátek. Začneme samozřejmě tím nejjednodušším - vykreslením celého obrázku na souřadnice x,y. K tomu slouží procedura draw. Zde si ji popíšeme:

TDXImageList.Items[x].Draw(plocha, pozice_x, pozice_y, část obrázku);

plocha: To, kam kreslíme. Vždy je to název naší DXDraw, a za tečkou surface. V našem případě tedy místo „plocha“ dosadíme „dxdraw1.surface“ (vždy bez uvozovek).
pozice_x: Určí, jak daleko od levého kraje dxdraw bude vykreslen tento obrázek My si zkusmo dosadíme třeba 20.
pozice_y: Určí výškovou polohu obrázku (vzdálenost od horního okraje). Pro nás třeba 15.
část obrázku: S tou ještě neumíme pracovat, takže dosadíme vždycky nulu.

Takže v našem případě vypadá příkaz takto:
dximagelist1.items.find(‘DelphiX‘).draw(dxdraw1.surface, 20, 15, 0); // v případě, že chceme vykreslit obrázek s názvem „DelphiX“

nebo takto:
dximagelist1.items[0].draw(dxdraw1.surface, 20, 15, 0); // v případě, že chceme vykreslit obrázek z konkrétní pozice v DXImageListu (začíná se od nuly, takže první obrázek má číslo 0, druhý 1, atd)

Jeden z těchto řádků vložte mezi fill a flip, jak bylo řečeno v části Nutné základy. Teď si můžeme program zkompilovat a uvidíme námi zvolený obrázek na souřadnicích x=20 a y=15. Teď si ukážeme praktické využití. Třeba zobrazení grafického kurzoru. Takže si do ImageListu vložte nějaký obrázek šipky pod názvem „Kurzor“ a použijte tento kód:


procedure TForm1.DXTimer1Timer(Sender: TObject; LagCount: Integer);
var x,y:integer; // definice proměnných
begin
if not dxdraw1.CanDraw then exit;
dxdraw1.Surface.fill(0);
	x:=mouse.cursorpos.x-form1.left; // vypočítá polohu x vzhledem k poloze okna a přiřadí ji proměnné x
	y:=mouse.cursorpos.y-form1.top; // vypočítá polohu y vzhledem k poloze okna a přiřadí ji proměnné y
	showcursor(false); // skryje windowsovský kurzor
	dximagelist1.Items.find('Kurzor').Draw(dxdraw1.surface,x,y,0); // vykreslí kurzor na x;y
dxdraw1.flip;
end;

- A ještě pár obrázků


obr. 1: standardní vykreslení na x;y


obr. 2: vykreslení kurzoru na polohu myši

Děkuji za trpělivost, a těším se u dalšího dílu.


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