PascalABC.NET

Массив всех графических объектов Objects

В модуле ABCObjects определен динамический массив Objects, который хранит все созданные графические объекты. Он принадлежит к типу ObjectsABCArray, определенному в ABCObjects. Для массива Objects определены всего 2 операции: Objects.Count возвращает количество графических объектов, а Objects[i] возвращает i-тый графический объект (типа ObjectABC, нумерация осуществляется с 0).

Использование массива Objects позволяет единообразно обращаться ко всем графическим объектам, вызывая для них любые методы и обращаясь к любым свойствам класса ObjectABC.

Пример 1. Броуновское движение объектов.

uses ABCObjects;

var i:integer;

begin   for i:=1 to 30 do
    new CircleABC(Random(WindowWidth),Random(WindowHeight),20,clRandom);
  while True do
    for i:=0 to Objects.Count-1 do
      Objects[i].MoveOn(Random(3)-1,Random(3)-1);
end.

В этом примере создается 30 объектов CircleABC. Поскольку все они сохраняются в массиве Objects, при их создании результат вызова конструктора не присваивается никакой переменной. После создания все объекты начинают перемещаться в бесконечном цикле на случайный вектор, совершая броуновское движение.

Пример 2. Изменение свойств объектов заданного типа.

uses ABCObjects;

var i:integer;

begin
  for i:=1 to 30 do
    case Random(2) of
      0: new CircleABC(Random(WindowWidth),Random(WindowHeight),20,clRandom);
      1: new RegularPolygonABC(Random(WindowWidth),Random(WindowHeight),20,3,clRandom);
    end;
  while True do
    for i:=0 to Objects.Count-1 do
      if Objects[i] is RegularPolygonABC then
        RegularPolygonABC(Objects[i]).Angle := RegularPolygonABC(Objects[i]).Angle + 1;
end.

В этом примере создается 30 объектов CircleABC или RegularPolygonABC. Затем в бесконечном цикле вращаются только объекты RegularPolygonABC. Вращение достигается увеличением свойства Angle, которое определено только в классе RegularPolygonABC. Для установки принадлежности объекта к классу RegularPolygonABC используется операция is, после чего объект Objects[i] преобразуется к типу RegularPolygonABC при помощи операции приведения типа.

Пример 3. Удаление всех графических объектов, пересекшихся с объектом p:

for i:=Objects.Count-1 downto 0 do
  if (Objects[i]<>p) and (p.Intersects(Objects[i]) then
    Objects[i].Destroy;

В играх часто нужно удалить все графические объекты, которые "настиг" объект p. Для этого следует перебрать все графические объекты за исключением самого p и проверить их на предмет пересечения с p. Удаление осуществляется вызовом деструктора соответствующего объекта. Отметим также, что в результате удаления количество объектов уменьшается, поэтому следует перебирать объекты от конца к началу.