Magazyn komputerowy PTiKuś
www.ptik.ivg.pl
#3 - Grudzień

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:

  1. Właściwość głównego formularza BorderStyle musi być ustawiona na bsnone.
  2. Właściwość używanego komponentu TDXDraw Align musi być ustawiona alClient.
  3. 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

Copyright (C) 2000 by PTiK
Wszelkie prawa zastrzeżone.
Kopiowanie tekstów i grafiki bez zgody autora zabronione !