2018-08-21 17:28:27 +03:00
|
|
|
|
uses WPFObjects;
|
|
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
|
/// Количество графических объектов
|
2018-12-12 17:45:12 +03:00
|
|
|
|
Count = 1000;
|
2018-08-21 17:28:27 +03:00
|
|
|
|
|
|
|
|
|
|
/// Возвращает случайный графический объект
|
2018-12-12 17:45:12 +03:00
|
|
|
|
|
|
|
|
|
|
var w := 50;
|
|
|
|
|
|
|
2018-08-21 17:28:27 +03:00
|
|
|
|
function NewRandomABC: ObjectWPF;
|
|
|
|
|
|
begin
|
|
|
|
|
|
case Random(3) of
|
2018-12-12 17:45:12 +03:00
|
|
|
|
0: Result := new CircleWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w/2),RandomColor);
|
|
|
|
|
|
1: Result := new RectangleWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w),Random(w),RandomColor);
|
|
|
|
|
|
2: Result := new StarWPF(Random(Window.Width.Round-w)+w/2,Random(Window.Height.Round-w)+w/2,Random(w/2),Random(w/2),Random(4)+4,RandomColor);
|
2018-08-21 17:28:27 +03:00
|
|
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
/// Передвигает графический объект с отражением его от стенок
|
|
|
|
|
|
procedure Move(o: ObjectWPF);
|
|
|
|
|
|
begin
|
|
|
|
|
|
o.Move;
|
|
|
|
|
|
if (o.Left<0) or (o.Left+o.Width>Window.Width) then
|
|
|
|
|
|
o.dx := -o.dx;
|
|
|
|
|
|
if (o.Top<0) or (o.Top+o.Height>Window.Height) then
|
|
|
|
|
|
o.dy := -o.dy;
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
2018-12-12 17:45:12 +03:00
|
|
|
|
procedure CreateAll;
|
2018-08-21 17:28:27 +03:00
|
|
|
|
begin
|
|
|
|
|
|
for var i:=1 to Count do
|
|
|
|
|
|
begin
|
|
|
|
|
|
var m: ObjectWPF := NewRandomABC;
|
|
|
|
|
|
repeat
|
|
|
|
|
|
m.dx := Random(-3,3);
|
|
|
|
|
|
m.dy := Random(-3,3);
|
|
|
|
|
|
until (m.dx<>0) and (m.dy<>0);
|
|
|
|
|
|
end;
|
2018-12-12 17:45:12 +03:00
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure MoveAll;
|
|
|
|
|
|
begin
|
|
|
|
|
|
for var i:=0 to Objects.Count-1 do
|
|
|
|
|
|
Move(Objects[i]);
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
Window.Title := 'Движущиеся объекты';
|
|
|
|
|
|
Invoke(CreateAll);
|
2018-08-21 17:28:27 +03:00
|
|
|
|
var k := 1;
|
|
|
|
|
|
while True do
|
|
|
|
|
|
begin
|
2018-12-12 17:45:12 +03:00
|
|
|
|
Invoke(MoveAll);
|
2018-08-21 17:28:27 +03:00
|
|
|
|
k += 1;
|
|
|
|
|
|
Window.Title := Format('{0,5:f2}',k/Milliseconds*1000)+' кадров в секунду';
|
|
|
|
|
|
end;
|
|
|
|
|
|
end.
|