Będzie to najprostszy i zarazem najkrótszy temat związany z OMEGĄ. Na poniższym rysunku jest pokazany bardzo prosty efekt przejścia jednego kafla w drugi
Można zauważyć, że krawędzie kafli kostki brukowej rozmywają się na granicy z trawą. Jest to efekt bardzo prosty do uzyskania, jeżeli tylko podmieni się standardowa metodę rysowania TSprite …Kod programu zawiera dwie warstwy, drzewa jako warstwa trzecia są losowane. Kostka brukowa rysowana jest w warstwie drugiej, trawa w warstwie pierwszej. Oczywiście podejście można zmienić. Rysując wszystko w warstwie pierwszej a jedynie na granicach tereny zastosować podwójne rysowanie…
Jak uzyskać taki efekt?
Bardzo prosto
Należy skorzystać z tej metody rysowania Draw4Col i pobawić się kanałami ALPHA, czyli przeźroczystością narożników kafla. Kod procedury wykonującej to zadanie przedstawiam poniżej
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
procedure TKafel.Draw; begin if ImageIndex=-1 then exit; Image.Draw4Col( Round(X),Round(Y), Round(X+Image.TileWidth),Round(Y), Round(X+Image.TileWidth),Round(Y+Image.TileHeight), Round(X),Round(Y+Image.TileHeight), 0,0,0,1,1, OmegaColor(Red,Green,Blue,AlphaA), OmegaColor(Red,Green,Blue,AlphaB), OmegaColor(Red,Green,Blue,AlphaC), OmegaColor(Red,Green,Blue,AlphaD), ImageIndex,0); end; |
Jest to ta sama metoda- procedura rysująca, która szerzej opisałem w „Górach i Dolinach”. Ten artykuł przedstawia inne jej zastosowanie. O płynnym przenikaniu kafli decydują wartości zapisane w zmiennych
AlphaA,AlphaB,…
Jak zmienić te wartości?
Proszę zerknąć na poniższy rysunek
Kafel (4,3) sąsiaduje w narożniku
–A z trzema kaflami zielonymi- powiedzmy trawa
–B z dwoma kaflami zielonymi i jednym niebieskim- powiedzmy woda
–C z trzema kaflami niebieskimi
–D z jednym niebieskim i dwoma zielonymi
Przyjmując teraz zasadę, że za każde sąsiedztwo rogu kafla (4,3)- woda z rogiem kafla tego samego typu zwiększamy stopień przezroczystości z wartości ZERO do jakiejś tam przyjętej w naszym modelu. Ja zwiększałem współczynnik Alpha o wartości 255 za każde sąsiedztwo a potem podzieliłem przez 3.
Poniżej odpowiedni fragment kodu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
for Ri:=0 to high(testRogow[Rj]) do begin nx:=k+kierunek1[testRogow[Rj,Ri],0]; ny:=w+kierunek1[testRogow[Rj,Ri],1]; if (nx<0)or(ny<0)or(nx>MaxX)or(ny>MaxY) then continue; if (AWarstwa[ny,nx].ImageIndex=AIDTest) then inc(Alpha,255); end; if AWarstwa[w,k].ImageIndex<>-1 then case Rj of //Rog A 0:AWarstwa[w,k].AlphaA:=Round(Alpha/3); //Rog B 1:AWarstwa[w,k].AlphaB:=Round(Alpha/3); //Rog C 2:AWarstwa[w,k].AlphaC:=Round(Alpha/3); //Rog D 3:AWarstwa[w,k].AlphaD:=Round(Alpha/3); end; |
I to cała tajemnica tego efektu, resztę czytelniku znajdziesz w załączonym kodzie. Rysowanie odbywa się przez klikanie lewym klawiszem myszki prawym chyba też:)
Jak to dobrze, że w Delphi i Omedze takie rzeczy robi się bardzo prosto…Ciekawe jak by to było w C?
Pozdrawiam oksal
Zbylitowska Góra 2 08 2007
Autor: oksal