DelphiX Tutor
DelphiX jest bardzo popularnym komponentem umożliwiającym obsługę
bibliotek Directx 6.0 w Delphi. Chciałbym przedstawić podstawowe możliwości
tego komponentu oraz przytoczyć najlepsze metody ich użycia. DelphiX
najczęściej przydaje się do tworzenia grafiki 2d. Właśnie o tym będzie
ten artykuł.
Pierwsze starcie
A wiec! Utwórzmy nowy projekt. Nazwijmy go lekcja1. Z palety
komponentów wstaw komponent DXDraw. Jest to ekran, na którym będzie wyświetlana
grafika. Właściwość align tego komponentu ustaw na alClient.
Dzięki temu dopasuje się te rozmiarów formularza. Teraz rozmiar
formularza ustaw na 300x300 pixeli.
Przydało by się wypróbować możliwości tego komponentu. Narysujmy
kilka figur. Do formularza wstaw przycisk. Nadaj mu etykietę
"Kreska". Utwórz procedurę obsługującą zdarzenie onclick
tego przycisku. Ta procedura, jak zapewne zdążyłeś się domyślić,
narysuje symboliczna kreskę. Można to zrobić w następujący sposób.
Przesunąć kursor do jakiegoś punktu za pomocą procedury moveto
a następnie wykreślić linie do innego punktu za pomocą procedury lineto.
Tak ma to wyglądać:
dxdraw1.surface.canvas.moveto(20,100);
dxdraw1.surface.canvas.lineto(200,10);
Na końcu tej procedury należy dopisać dwie inne istotne rzeczy.
Wpierw trzeba użyć procedury release. Bez niej Winshit (Windoza,
Szklana pułapka czyli Windows) może się zawiesić. Następnie trzeba
,,wyrzucić" to wszystko na ekran za pomocą procki flip.
Wszystko dotąd rysowaliśmy w pamięci komputera. Dopiero teraz po użyciu
procki flip odświeżamy ekran.
dxdraw1.surface.canvas.release;
dxdraw1.flip;
Teraz, gdy uruchomisz program, po naciśnięciu przycisku
na ekranie ukaże się kreska.
Sprawy trudniejsze
Przeciętny Polak by powiedział: ,,Co ty Heniek mnie tu za banały
piep.....". To były podstawy podstaw :). Kreska raczej nikogo nie
satysfakcjonuje. Bardziej efektowne będą bitmapki. Są dwie metody
rysowania bitmap:
- klasyczna metoda przy użyciu canvas i jakieiś bitmapki załadowanej
do TBitmap
- szybka metoda przy użyciu komponentu TDXimagelist
Tej pierwszej nie będę przytaczał, ponieważ się jej brzydzę. Ta
druga jest najlepsza i najłatwiejsza do opanowania. Utwórzmy nowy
projekt o nazwie lekcja2. Wstaw i ustaw tak jak poprzednio
komponent TDXDraw. Następnie wstaw komponent TDXimagelist.
Dzięki temu komponentowi będziesz mógł ładować wiele bitmap i rysować
je na wiele sposobów. Na początku ustaw właściwość dxdraw
nowowstawionego komponentu na dxdraw1 (lub na inną jaka wybrałeś dla
komponentu TDXDRAW). Aby wstawić rysunek należy wybrać właściwość items.
Dalej wcisnąć przycisk Add New. Następnie wybieramy właściwość
picture. Dalej załaduj jakąś dowolną bitmapę (może być jakiś
pornos :)). Teraz wstaw przycisk i nadaj mu etykietę (caption)
,,Rysuj". Utwórz zdarzenie onclick tego przycisku. Aby
narysować naszą bitmapę trzeba użyć tej oto procedury"
dxdraw1.dximagelist1.Items.Items[n].draw(dest,x,y,patternindex);
n- Numer bitmapy.
dest- Surface na, którym ma być narysowana bitmapa. W przypadku
naszego programu można wstawić w to mejejsce dxdraw1.surface lub dximagelist1.dxdraw.surface.
W obu przypadkach efekt jest ten sam.
x i y- Współżędne punktu, od którego będzie rysowana bitmapa.
PatternIndex- Najlepiej wstawić 0.
Oprócz procedury draw jest jeszcze inna przydatna procka do
rysowania obróconych bitmap:
DrawRotate(Dest, X, Y, Width, Height, PatternIndex, CenterX, CenterY,
Angle);
dest- Surface na, którym ma być narysowana bitmapa. W przypadku
naszego programu można wstawić w to miejsce dxdraw1.surface lub dximagelist1.dxdraw.surface.
W obu przypadkach efekt jest ten sam.
x i y- Wspołżędne punktu, od którego będzie rysowana bitmapa.
Width i Height- Rozmiary jakie ma przybrać obrócona bitmapa.
PatternIndex- Najlepiej wstawić 0.
CenterX i CenterY- Punkt na ekranie wzglądem, którego ma być
obracana bitmapa.
Najczęściej podaje się 0.5 dla obu parametrów.
Angle- Kąt o jaki ma być obrócona bitmapa. UWAGA!!! Zamiast 360
stopni mamy 256. Wiec każdy kat ze skali 0-360 stopni , aby otrzymać
odpowiedni ze skali 0-256 stopni, należy pomnożyć przez 0.7.
Mam nadzieję, że narysowanie tej bitmapy nie stworzyło Ci zbyt dużo
problemów.
Animacja
Gdy już wiemy jak rysować, czas na naukę robienia animacji. Do
projektu lekcja2 dodaj komponent TDXTimer. Jego właściwość Interval
określa co ile mili sekund ma być wywoływane zdarzenie OnTimer
tego komponentu. Ustaw ją na 1. Aby takie zdarzenie utworzyć, kliknij
dwa razy we właściwość o nazwie OnTimer pod zakładką events
w Object Inspektorze. Zróbmy obracający się obrazek. W tym celu
utwórz zmienna globalna o nazwie angle. Zainicjuj jej wartość w
konstruktorze formularza. Niech jej początkową wartością będzie 0.
Teraz w zdarzeniu OnTimer dodaj kod, który będzie zwiększał
wartość zmiennej angle
o 1. Może on mieć taka postac:
inc(angle,1);
Teraz dodaj procedurę DrawRotate rysująca bitmapę nr 1 pod
katem angle. Powinna wyglądać tak:
dximagelist1.items.items[0].DrawRotate(dxdraw1.surface, 60, 60, 100,
100, 0, 0.5, 0.5, Angle);
Na końcu zdarzenia dodaj kod, który jest ci już znany, odświeżający
ekran (procki release i flip). UWAGA!!! Możesz mieć
problemy z narysowaniem JPGa lub GIFa. Najlepiej jeżeli rysujesz BMP.
Komponent TDXTimer zawiera tez taka fajna funkcje zwracającą ilość
wyświetlanych klatek na sekunde. Ta funkcja nazywa się FrameRate.
Możesz użyć jej w kodzie w np. taki sposób:
dxdraw1.surface.Canvas.textout(20,20,inttostr(DXTimer1.FrameRate));
Dzięki temu zobaczysz na ekranie prędkość animacji.
Dotąd nasz program działał w okienku. Przyszedł czas abyś się
dowiedział jak wyświetlać grafikę na całym ekranie. Aby zobaczyć
grafikę na całym ekranie muszą być spełnione następujące warunki:
- Właściwość głównego formularza
BorderStyle musi być ustawiona na bsnone.
- Właściwość używanego komponentu
TDXDraw Align musi być ustawiona alClient.
- Właściwość używanego komponentu
TDXDraw Options/FullScreen musi mięć wartość true.
Zastosowanie
DelphiX można używać przy robieniu animacji w grach, wygaszaczy
ekranu. DelphiX jest stosunkowo wolnym enginem graficznym. Np. Gdy używasz
procedury DrawRotate w swoim programie FPS spada znacznie. Gra z tą
procka będzie miała prędkość rzędu 30 FPS. Mimo to DelphiX nie jest
taki zły Można dzięki niemu napisać wiele rodzajów gier.
FIN
To są wszystkie wiadomości potrzebne ci do sprawnego używania
DelphiX do tworzenia grafiki. Oczywiście to jest dopiero początek. Nie
mam zamiaru omawiać wszystkich procedur, bo było by to bez sensu i zajęło
by to bardzo dużo mjeisca. Nie wystarczy znać bardzo dobrze DelphiX aby
napisać sprawnie działający program. Należy umieć tworzyć algorytmy,
bez których nie da się nic ciekawego zrobić.
GREG
warsztat@poczta.fm
http://www.warsztat.px.pl
|