Массив всех графических объектов 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
. Удаление осуществляется вызовом деструктора соответствующего объекта.
Отметим также, что в результате удаления количество объектов уменьшается,
поэтому следует перебирать объекты от конца к началу.