Yo desaconsejo el uso de FreeAndNil; ya ha habido varios debates en torno al tema
El problema que tenes es
otro
Por que liberar la memoria de un objeto que vas a volver a usar?
Sobre todo si estas haciendo juegos, en donde como usas la memoria (o como no la aprovechas) se termina volviendo un problema
Ten en cuenta que la creacion de objetos es una operacion con costo, y hay objetos que son mas pesados que otros (TImage es uno de ellos)
Yo haria algo similar a esto:
Código Delphi
[-]
uses
Graphics;
type
TTrafico = class
strict private
FImage: TImage;
FChocado: Boolean;
private
procedure SetChocado(const Value: Boolean);
public
constructor Create;
destructor Destroy; override;
function VerificarChoque(const ATop, ALeft: Integer): Boolean;
property Chocado: Boolean read FChocado write SetChocado;
property Imagen: TImage read FImage;
end;
implementation
constructor TTrafico.Create;
begin
inherited Create;
FImage := TImage.Create;
FChocado := False;
end;
destructor TTrafico.Destroy;
begin
FImage.Free;
inherited;
end;
procedure TTrafico.SetChocado(const Value: Boolean);
begin
FChocado := Value;
end;
function TTrafico.VerificarChoque(const ATop, ALeft: Integer): Boolean;
begin
Result := ...
end;
Ahora tendrias una clase propia en lugar de una imagen suelta, en la cual podes agegar un monton de informacion de estado, comportamiento, incluso eventos, etc
En lugar de un array de TImage, ahora tendrias un array of TTrafico
En cada elemento del array, tendrias una clase la cual contiene a su vez una imagen, accesible desde una propiedad, y una variable de bandera (Boolean) para saber si "esta chocado o no"