Mindehhez először is meg kell változtatnunk a Form alakját. A könnyebb munka érdekében a bogár alakját ellipszis alakúra választottuk, így a CreateEllipticRgn függvény segítségével egyszerűen definiálhatunk számára egy ellipszis alakú régiót. Mivel a bogár 4 irányban mozoghat, ezért külön kell választanunk a fel-le, illetve a jobbra-balra irányuló mozgásokat, ugyanis első esetben álló, míg második esetben fekvő ellipszist kell definiálnunk.
procedure TForm1.DefineRegion;
begin
DeleteObject(hRegion);
Case direction of
0,2 : hRegion:=CreateEllipticRgn(6,30,42,111);
1,3 : hRegion:=CreateEllipticRgn(6,25,94,60);
end;
SetWindowRgn(Handle, hRegion, True);
end;
A DeleteObject függvénnyel felszabadítjuk az összes erőforrást, mely a hRegion objektumhoz tartozik, míg a SetWindowRgn függvény meghívásával beállíthatjuk a megadott régiót a Form-unkra.
A mozgás irányát egy-egy számmal definiáltuk, az alábbi módon.
- 0: fel
- 1: jobbra
- 2: le
- 3: balra
Mivel minden irányban más-más képet fogunk megjeleníteni, így a Form-on elhelyeztünk négy Image komponenst, melyek tartalmazzák a mozgásirányoknak megfelelő képeket. Amikor a Form létrejön, ezeket elhelyezzük annak bal felső sarkában, majd definiáljuk a régiót.
procedure TForm1.FormCreate(Sender: TObject);
begin
Width:=196;
Height:=216;
Image1.Left:=0;
Image1.Top:=0;
Image2.Left:=0;
Image2.Top:=0;
Image3.Left:=0;
Image3.Top:=0;
Image4.Left:=0;
Image4.Top:=0;
DefineRegion;
end;
A bogár mozgatása véletlenszerűen történik. A mozgásirányokat a Random függvénnyel generáljuk. Mindezt egy számláló OnTimer eseményében helyezzük el, így a mozgás sebességét a Timer intervalluma fogja meghatározni. Azonban a mozgatás egyenletessége érdekében generálunk egy újabb véletlen számot. Esetünkben hét számjegy közül kapunk véletlenszerűen értéket. Amennyiben ez az érték ebből az intervallumból (esetünkben 0..6) egy általunk tetszőlegesen választott számmal egyezik meg, akkor történik a mozgatás.
procedure TForm1.Timer1Timer(Sender: TObject);
Var
StepX, StepY: integer;
NLeft, NTop : integer;
Const
Offset=6;
begin
if Random(7)=2 then
begin
Direction:=Random(4);
A kapott mozgásirányoknak megfelelően jelenítjük meg a képeket.
image1.visible:=Direction=0;
image2.visible:=Direction=1;
image3.visible:=Direction=2;
image4.visible:=Direction=3;
DefineRegion;
end;
A StepX változóban a kapott mozgásiránynak megfelelően a Form vízszintes, míg a StepY-ban a függőleges irányú elmozdulását adjuk meg.
Case Direction of
0 : StepX:=0;
1 : StepX:=2;
2 : StepX:=0;
3 : StepX:=-2;
end;
Case Direction of
0 : StepY:=2;
1 : StepY:=0;
2 : StepY:=-2;
3 : StepY:=0;
end;
Az NLeft változóban kapjuk meg a Form-nak a képernyő bal oldalától, míg az NTop-ban a tetejétől számított új értékét. Az Offset segítségével az elmozdulás nagyságát tudjuk szabályozni.
NLeft:=Left+StepX*Offset;
NTop:=Top-StepY*Offset;
Amennyiben a bogár túllépi a képernyőt, visszaigazítjuk a koordinátáit a képernyő széleihez.
if NLeft>Screen.Width then NLeft:=Screen.Width-Width;
if NTop>Screen.Height then NTop:=Screen.Height-Height;
if NLeft<0 then NLeft:=0;
if NTop<0 then NTop:=0;
Form1.Left:=NLeft;
Form1.Top:=NTop;
end;
Az alkalmazást indítás után az ALT+F4 billentyűkombinációval lehet lezárni, vagy ha valaki nagyon gyorsan tudja a bogarat követni a képernyőn az egérrel, akkor úgy is bezárhatja, hogy rákattint a képére.