unit Unit1;
interface
uses
Classes, Graphics, Controls, Forms, ExtCtrls;
type
TAnimatedShape = class(TShape)
private
FSpeedX, FSpeedY: Integer;
public
constructor Create(InitSpeedX, InitSpeedY: Integer; Owner: TComponent); reintroduce;
procedure Animate;
property SpeedX: Integer read FSpeedX;
property SpeedY: Integer read FSpeedY;
end;
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
Shape1, Shape2: TAnimatedShape;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Shape1.Animate;
Shape2.Animate;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;//Prevent flicker
Shape1 := TAnimatedShape.Create(3, 5, Self);
Shape2 := TAnimatedShape.Create(5, 10, Self);
end;
{ TAnimatedShape }
procedure TAnimatedShape.Animate;
begin
If Left > Parent.ClientWidth - Width - 5 Then
Begin
Left := Parent.ClientWidth - Width - 5 ;
FSpeedX := - FSpeedX;
Brush.Color := ClRed;
End
Else If Left < 0 Then
Begin
Left := 0;
FSpeedX := - FSpeedX;
Brush.Color := ClGreen;
End;
If Top > Parent.Clientheight - height - 5 Then
Begin
Top := Parent.ClientHeight - height - 5 ;
FSpeedY := - FSpeedY;
Brush.Color := ClBlue;
End
Else If Top < 0 Then
Begin
Top := 0;
FSpeedY := - FSpeedY;
Brush.Color := ClSilver;
End;
Left := Left + FSpeedX;
Top := Top + FSpeedY;
end;
constructor TAnimatedShape.Create(InitSpeedX, InitSpeedY: Integer; Owner: TComponent);
begin
inherited Create(Owner);
Parent := TWinControl(Owner);
Shape := stCircle;
FSpeedX := InitSpeedX;
FSpeedY := InitSpeedY;
end;
end.