fizyka wzory prawa zadania teoria, chemia teoria zadania wzory, modelarstwo szkutnicze
gory21.jpg

Pobierz kod Góry i doliny Świata 2D- część 2
 
GÓRY I DOLINY ŚWIATA 2D- część 2

gory21.jpg

Wyżej mamy efekt działania kodu części drugiej. Aby go uzyskać należy odpowiednio wykorzystać informację zapisaną w


...PPunkt(Lista.Items[i])^.fH


Wartości zapisane w tym polu odpowiednio przesuwają współrzędne rogów kafli w kierunku osi Y. Co w rezultacie prowadzi do uzyskania efektu pofałdowania terenu. Oczywiście zgodnie z tymi wartościami należy zdeformować kafle świata 2D.

Jak to zrobić?

Do deformacji kafli idealnie nadaje się procedura Draw4Col, która jest dostępna w zestawie możliwości rysowania grafiki na przykład komponentu


TOmegaImageList.ImageList.Items[ ].Draw4Col(...)


Poniższy rysunek zawiera opis parametrów podawanych do tej procedury

gory22.jpg

Czy o deformacji bitmapy będzie decydować układ wartości zapisanych w : X1,Y1,Col1,....,X4,Y4,Col4. Oznaczenia X,T dotyczą współrzędnych kolejnych rogów kafla zliczanych zgodnie z ruchem wskazówek zegara. Parametry Col1..Col4 decydują o kolorze rysowanego narożnika. Ich modyfikacja może dać ciekawe efekty.
Ponieważ te parametry są typu


TOmegaColor(Red,Green,Blue,Alpha)


Przykładowo dobierając odpowiednio wartości kanału Alpha możemy uzyskać płynne przejścia pomiędzy sąsiednimi kaflami lub różne efekty przezroczystości. My jedynie wykorzystamy składowe RED, GREEN, BLUE do uzyskania efektu cieniowania zdeformowanego kafla.

KAFEL...

W naszym modelu warstwa świata 2D będzie zbudowana na poniższej klasie


PKafel=^TKafel;
TKafel=class(TSimpleAnimSprite)
fA, //wspol. kolejnych rogow prostokata
fB, //A------------B
fC, //| |
FD :TWspolrzedna; //D------------C
fIdObraz,
fIdKlatka:integer;
fOmegaImageList:TOmegaImageList;
protected
property OmegaImageList:TOmegaImageList read fOmegaImageList write fOmegaImageList;
property IdObraz :integer read fIdObraz write fIdObraz;
property IdKlatka :integer read fIdKlatka write fIdKlatka;
property A :TWspolrzedna read fA write fA;
property B :TWspolrzedna read fB write fB;
property C :TWspolrzedna read fC write fC;
property D :TWspolrzedna read fD write fD;
public
constructor Create(const AParent: TOmegaSprite;
const AOmegaImageList:TOmegaImageList;
const AIdObraz,AIdKlatka:integer;
Const AA,Ab,Ac,Ad:TWspolrzedna);
procedure Draw;override;
procedure UaktualniWspolrzedne(Const AA,Ab,Ac,Ad:TWspolrzedna);
end;


jak widać będą to wskaźniki. Oczywiście na potrzeby tego artykułu nie robię dużego świata. Ale można tak zorganizować jego "wyświetlanie", że FPS nie będzie zależny od rozmiaru świata i będzie utrzymany na poziomie 200 .

Zapis świata przy użyciu wskaźników wymaga zastosowania na przykład list. Proces tworzenia kolejnych kafli odbywa się na tych samych zasadach co proces tworzenia punktów opisanych w części pierwszej. Jedynie należy pamiętać o tym, że liczba kolumn i wierszy dla kafli jest o jeden mniejsza od liczby kolumn i wierszy dla punktów. Zobrazuję to poniższym rysunkiem

gory23.jpg

Łatwo policzyć, że dla czerwonych punktów kolumn jest 5, wierszy- 4. Dla zielonych kafli : kolumn jest 4 a wierszy: 3. O tym fakcie należy pamiętać.

W pierwszej części opisałem w jaki sposób zmieniać wartości pochyłości terenu teraz należy te zmiany zarejestrować w kaflach. My zrobimy to w zdarzeniu kliknięcia myszką wywołując procedurę UaktualnijWspolrzedneKafli; która to wywoła procedurę UaktualniWspolrzedne(Const AA,Ab,Ac,Ad:TWspolrzedna) kolejnych kafli.



procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
.....
.....
.....
//szczyty i doliny
if Button=mbLeft then szczyt(idAktywny,-8);
if Button=mbRight then szczyt(idAktywny, 8);
UaktualnijWspolrzedneKafli;
end;


Zarejestrowane zmiany w polach fA, fB, fC, fD kafli będą wpływać na sposób jego rysowania. Czyli my musimy odpowiednio opracować procedurę rysowania kafla.

RYSOWANIE KAFLI


procedure TKafel.Draw;
begin
fomegaImageList.ImageList.Items[fIdobraz].Draw4Col((Round(fA.X),
Round(fA.Y),
Round(fB.X),
Round(fB.Y),
Round(fC.X),
Round(fC.Y),
Round(fD.X),
Round(fD.Y),
0,0,0,1,1,
OmegaColor(Round(255+fA.h),Round(255+fA.h),Round(255+fA.h),255),
OmegaColor(Round(255+fB.h),Round(255+fB.h),Round(255+fB.h),255),
OmegaColor(Round(255+fC.h),Round(255+fC.h),Round(255+fC.h),255),
OmegaColor(Round(255+fD.h),Round(255+fD.h),Round(255+fD.h),255),
fIdKlatka,0);
end;


Ta procedura zastąpiła standardową procedurę DRAW poprzez użycie dyrektyw override. Zobacz do ciała klasy kafla.

Jako, że PKafel jest potomkiem klasy TSimpleAnimSprite, to odpada nam rysowanie kolejnych kafli przy użyciu pętli. Zrobi to za nas procedura OmegaSprite1.Draw;

W zasadzie mamy wszystko co jest nam potrzebne do "rzeźbienia" terenu. Wystarczy tylko kliknąć lewym klawiszem myszki to powstanie nam górka, prawym - dolinka. I to by było na tyle. Teraz zostaje odpowiednio opracować metodę chodzenia duszka po takim świecie.

I tym optymistycznym akcentem kończę ten artykuł, chodzenie będzie w trzeciej części...
 
Układ okresowy- kod qr
Układ okresowy

Układ okresowy pierwiastków- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Alkomat- wirtualny test kod qr
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Światłomierz fotograficzny kod qr
Światłomierz fotograficzny

Światłomierz fotograficzny- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Taklarz- olinowanie stałe kod qr
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz