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