
A program futása közben méretezze át a Form-ot!
A labda mozgatására egy TTimer komponenst használunk. Mikor ennek OnTimer eseménye fut, akkor változtatjuk a labda aktuális helyzetét. A labda pozícióját az FBallPosition változó tárolja, míg a lépésköz mértékét és irányát az FBallMotion változó. A következő lépéshez csak hozzáadjuk ez utóbbi változó értékét az FBallPosition-hoz.
procedure TForm1.Timer1Timer(Sender: TObject);
begin
FBallPosition.x:=FBallPosition.x+FBallMotion.x;
FBallPosition.y:=FBallPosition.y+FBallMotion.y;
Ezt követően kell ellenőriznünk, hogy az új érték még az adott területen belül van-e, vagy már nem. Az ellenőrzésnél figyelembe kell vennünk a labda méretét is, melyet a BallSize konstans tárol.
Az ellenőrzés négy érték vizsgálatból áll, mely a labda helyzetét összehasonlítja a fal helyzetével. Abban az esetben, ha labda elérte valamelyik falat, akkor a lépés irányát megváltoztatjuk, így következő OnTimer-nél már másik irányban halad tovább a labda.
if (FBallPosition.x>ClientWidth-BallSize) then begin
FBallMotion.x:=-Abs(FBallMotion.x)
end else begin
if FBallPosition.x<0 then begin
FBallMotion.x:=Abs(FBallMotion.x);
end;
end;
if (FBallPosition.y>ClientHeight-BallSize) then begin
FBallMotion.y:=-Abs(FBallMotion.y)
end else begin
if FBallPosition.y<0 then begin
FBallMotion.y:=Abs(FBallMotion.y);
end;
end;
Végső lépésként gondoskodunk a labda új helyre történő kirajzolásáról, melyet a DrawScreen eljárásunk végez.
A DrawScreen eljárás a belső FScreen bitmap-re rajzolja ki a labdát jelképező kört, majd ezt a bitmap-et rajzoljuk ki a Form-ra, a Canvas osztály Draw eljárásával.
procedure TForm1.DrawScreen;
begin
with FScreen.Canvas do begin
Brush.Color:=clBlack;
FillRect(ClientRect);
Brush.Color:=clwhite;
Ellipse(FBallPosition.x, FBallPosition.y, FBallPosition.x+BallSize, FBallPosition.y+BallSize);
end;
Canvas.Draw(0, 0, FScreen);
end;
Figyelnünk kell a Form átméretezését is. Ekkor a FSreen bitmap-ünk méretét a Form aktuális méretéhez kell igazítanunk.
procedure TForm1.FormResize(Sender: TObject);
begin
FScreen.Height:=ClientHeight;
FScreen.Width:=ClientWidth;
end;