|
|
|
|
Példaprogram letöltése
9279 bájt
|
Ebben a példában egy olyan komponenst mutatunk be, amely egy tetszőleges számú görbékből álló alakzatot mozgat, folyamatos színátmenettel.
A mellékelt példaprogram megnyitása előtt a MovingBezier.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A Sections property-ben adhatjuk meg, hogy az alakzat hány görbéből fog állni. Az első görbe kezdőpontja, és az utolsó görbe végpontja egybe esik, így mindig egy zárt alakzatot kapunk. A komponens Interval és Speed property-jein keresztül tudjuk szabályozni a mozgatás sebességét. A színváltáshoz, és a pontok koordinátáinak számításához egy TTimer-t használunk, ennek időzítését állíthatjuk az Interval property-n keresztül. A Speed property-nek a koordináták kiszámításánál van szerepe. A koordináták minden lépésben csak annyi pixelnyit mozognak el a megfelelő irányba, amennyit a Speed property-ben beállítottunk.
A görbe mozgatása az Active property igazra állításával történik.
Az alakzat kirajzolásához a TCanvas osztály PolyBezier eljárását használjuk. Ennek paramétere egy tömb, amely TPoint típusú elemeket tartalmaz. A tömb elemeinek száma attól függ, hogy hány görbéből szeretnénk felépíteni az alakzatot. A legegyszerűbb eset, amikor csak egy görbét használunk fel (Sections=1), de már ebben az esetben is négy koordinátát kell megadni, vagyis egy 4 elemű tömbre lesz szükség. Az első elem a görbe kiindulópontjának koordinátája. A második elem a kiindulóponthoz tartozó kontrollpont koordinátája. A következő elem a végponthoz tartozó kontrollpont koordinátája, míg végül meg kell adni a görbe végpontjának koordinátáját. Minden további görbénél 3-3 elemre lesz szükség, mivel a következő görbe kezdőpontja, mindig az előző görbe végpontja. A szükséges elemek számát tehát a következőképpen lehet meghatározni:
Mivel a görbék száma nincs korlátozva, ezért a koordináták tárolására dinamikus tömböt fogunk használni (FPoints), aminek elemei TPoint típusúak. Az elemek számát tehát futási időben kell meghatároznunk, akkor, amikor a Sections property-nek értéket adunk:
Miután beállítottuk az elemek számát, feltöltjük azokat véletlenszerűen előállított koordinátákkal. Minden egyes koordinátához tartozik egy irány is, ami azt mondja meg, hogy a koordináta értékét csökkenteni, vagy növelni kell-e a következő lépésben. Ezeket az irányokat szintén egy dinamikus tömbben tároljuk (FDirections), aminek elemei TPoint típusúak. Az elemek x és y mezőinek értékei 1, és -1 lehetnek, az iránytól függően. Kezdetben ezeket is véletlenszerűen választjuk ki.
A koordináták következő értékeit a DoTimer eljárásban számoljuk ki, ami az FTimer objektum OnTimer eseményének bekövetkezésekor fut le. A mozgatás elve egyszerű: a koordinátákat "pattogtatjuk" a komponens szélein. Vagyis amikor egy koordináta érték kívül esik a komponens területén, akkor megváltoztatjuk a mozgatás irányát. Ezt tesszük az összes koordinátával, kivéve az utolsót, ami mindig megegyezik az elsővel.
A mozgatáson kívül van még egy effekt amit megvalósítunk, ez pedig a szín folyamatos változtatása. Ehhez három változót használunk fel, amiben az egyes színösszetevőket tároljuk, valamint mindegyikhez 1-1 változót, ami a színváltoztatás "irányát" határozza meg. A színváltoztatás elve szintén egyszerű, összesen hat lépésben történik. Az első lépésben a piros és a kék színösszetevő értéke a maximumon van, tehát a kiinduló szín a lila. Ezután csak a következő feltételeket kell figyelni:
1. amikor a piros szín elérte a maximumot, akkor a kéket elkezdjük csökkenteni.
2. amikor a kék szín elérte a minimumot, akkor a zöldet elkezdjük növelni.
3. amikor a zöld szín elérte a maximumot, akkor a pirosat elkezdjük csökkenteni.
4. amikor a piros elérte a minimumot, akkor a kéket elkezdjük növelni.
5. amikor a kék elérte a maximumot, akkor a zöldet elkezdjük csökkenteni.
6. amikor a zöld elérte a minimumot, akkor a pirosat elkezdjük növelni.
Ha figyelmesen végigkövetjük a változásokat, akkor láthatjuk, hogy az utolsó lépésben elértünk a kiinduló állapothoz, tehát a piros és a kék szín maximumon lesz. Ekkor kezdődik minden elölről. A hat lépés alatt a következő színek fogják követni egymást: lila, piros, sárga, zöld, türkiz, kék, és megint lila. Az egyes színek a folyamatos színcsökkentés- és növelés miatt fokozatos színátmenettel követik egymást.
A kirajzolásnál nincs más dolgunk, mint a három színösszetevőből előállítani a színt, és a PolyBezier eljárással megrajzolni az alakzatot:
with Canvas do begin
Pen.Color:=RGB(FRed, FGReen, FBlue);
PolyBezier(FPoints);
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 457. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|