[DelphiX Tutorial]
-----------------------------------------------
--------     DirectX in Delphi (cz 2)  --------
--------    Copyright by Sulek [r]     --------
--------      sulek@shnet.pl           --------
-------- http://coders.shnet.pl/klub/  --------
--------      ^ wiecej artykulow ^     --------
-----------------------------------------------

Dokument powstal: 02 08 2000 r

=== Slowem wstepu ===

Witam w kolejnej, juz drugiej zcesci naszego tutoriala !
Skoro tutaj trafiles pierwsza czesc pewnie przypadla Ci do gustu. W drugiej tez nie pozwole Ci sie nudzic:-) Pokaze tu, jak wykorzystywac bitmapy w swoich aplikacjach, jakje obracac, nakladac na nie efekty itp. Zaczynamy !

=== Let's start ! ===

Aby wstawic bitmape skorzystamy z komponentu TDXImageList [DXImageList]
Czyli tworzymy nowy projekt w indetyczny sposób jak w tutorialu nr 1 Nie dodajemy jednak komponentu TDXTimer ani TDXInput. Przeciagamy komponent TDXImageList na forme. W Object Inspektorze wybieramy Items i dodajemy jakis obrazek (tylko BMP i DIB - nawet jesli Twoje Delphi czyta inne formaty). Teraz przechodzimy do procedury obslugi zdarzenie OnCreate dla MainForm i wpisujemy:

// inicjujemy DXDraw DXDraw.Initialize; // Sprawdzamy czy mozemy rysowac if not DXDraw.CanDraw then begin // jesli inicjacja sie nie powiodla MessageBox(Handle, 'DXError', 'Blad inicjacjiDirectX', 0); Close; end; // uaktualniamy palete kolorow DXImageList.Items.MakeColorTable; DXDraw.ColorTable := DXImageList.Items.ColorTable; DXDraw.DefColorTable := DXImageList.Items.ColorTable; DXDraw.UpdatePalette; // rysujemy bitmape DXImageList.Items[0].Draw(DXDraw.Surface, 10, 10, 0); DXDraw.Surface.Canvas.Release; // wyrzucamy na ekran DXDraw.Flip;

Udało sie ! Na ekranie wyświetlony został obrazek.
Zrodla do przykladu 4

*** Efekty specjalne ;-) ***

DirectX pozwala na łatwe obracanie bitmat, stosowanie fitlrów itp. Tutaj przedstawię kilka z nich: TDirectDrawSurface.DrawAlpha Pierwszy paramtr procedury to Surface DXDraw (miejsce gdzie mamy rysowac)
Drugi to wspolrzedne prostokata, w ktorym bedziemy rysowali np. Rect(10, 10, 100, 100) Trzeci parametr ustaw na 0 (nie znalazlem opisu w Helpie)
Czwarty parametr to intensywnosc filtru od 0 do 255.
Przyklad wywolania funckji to
DXImageList.Items[0].DrawAlpha(DXDraw.Surface, Rect(0, 0, 100, 100), 0, 140);
Procedure ten najlepiej zailustruje nastepujacy przyklad:
Dodaj komponent TDXTimer, ustaw jego Enabled na false. Po inicjacji DXDraw ustaw DXTimer.Enabled na True.
Interval powinien wynosic 0
Zadeklaruj zmienna globalna Alpha i nadaj jej wartosc 0 w procedurze MainForm.OnTimer
Teraz dodaj obsluge procedury onTimer. A w niej napisz:

procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer); begin DXTimer.Enabled:= false; // wylaczenie Timera Inc(Alpha,5); // zwiekszenie intensywnosci if Alpha > 255 then Alpha:= 0; // jezeli max wartosc to przypisz wart. min // czyszczenie kranu DXDraw.Surface.Fill(0); // rysowanie obrazka DXImageList.Items[0].DrawAlpha(DXDraw.Surface, Rect(100, 100, 364, 164), 0, Alpha); // surface ==> ekran DXDraw.Surface.Canvas.Release; DXDraw.Flip; DXTimer.Enabled:= True; // wlaczenie Timera end;

Zrodla do przykladu 5
TDirectDrawSurface.DrawRotate
Ta procedura obraca bitmape o podany kat (Angle)
Naprosciej bedzie wytlumaczyc jej dzialanie na przykladzie.
Usun z procedury obslugi zdarzenia onTimer procedure odpowiedzialna za rysowanie (DrawAlpha).
W jej miejsce wpisz:
DXImageList.Items[0].DrawRotate(DXDraw.Surface, 300, 300, 264, 64, 0, 0, 0, Angle);
Pozwolilem sobie zmienic takze nazwe zmiennej Alpha na Angle oraz dla uproszczenia usunalem mechanizm sprawdzajacyczy osiagnela juz ona maxymalna wartosc.
Ta procedura powinna wyswietlic nasza bitmape (zakladam, ze jej rozmiary to 264x64) obrocona o kat Angle wokol punku P(300, 300). Rozmiary bitmapy wynosza 264x64.
Zrodla do przykladu 6

Na podstawie wyzej wymienionych przykladow mozesz juz sam rozszyfrowac procedure DrawAlphaRotate oraz DrawWaveX (zadanie domowe ;-)

*** Ćwiczenia ***

Ćwiczenia pozwolą Ci lepiej zapamiętać o czym pisałem oraz nauczą Cię samemu szukać w dokumentacjach. Jeśli stworzyłeś ciekawy projekt, który mógłby posłużyć jako przykłąd albo ćwiczenie wyślij go na adres:
sulek@shnet.pl
Właśnie dzięki Waszym przykładom ta strona może stać się ciekawsza !
A teraz ćwiczenia:
1. Napisz program, w którym użytkownik będzie sterował obrotem bitmapy wokół punktu strzałkami. 2. Napisz program wykorzysujący funckę DrawRotateAlpha

*** Co dalej ***

Nastepnej lekcji jeszcze nie ma...
Strona główna
Poprzednia lekcja
Następna lekcja

********************************
*Paweł Sulkowski               *
*e-mail: sulek@shnet.pl        *
*http://coders.shnet.pl/klub/  *
********************************