Ver Mensaje Individual
  #1  
Antiguo 06-03-2016
Avatar de Tiaguito_Power
Tiaguito_Power Tiaguito_Power is offline
Registrado
 
Registrado: feb 2007
Posts: 6
Reputación: 0
Tiaguito_Power Va por buen camino
Smile Verificar existencia de TImage

Hola, muy buenas tardes a todos, les comento que estoy con Delphi XE y programando un juego de autos, quizas algunos lo recuerden de los 90, era unca caja cuadrada con un visor de acrilico con un autito fijo que se movia hacia los costados con un volantecito, y los obstaculos estaban pegados a un rodillo que funcionaba a cuerda, cuando le dabas cuerda el rodillo giraba y emulaba el movimiento del autito digamos. Bueno estoy haciendo basicamente eso, la cosa es asi, hay varios TImage, uno hace de fondo, otros las lineas blancas de la calle que se mueven, 2 autos fijos con movimiento lateral y dinamicamente un array de 250 imagenes que se van creando conforme pasa el tiempo en un TTimer. El proceso es el siguiente, al crear una imagen a la que considero trafico y esta choca con alguno de los dos autitos debería desaparecer, hasta ahi bien logro hacer que desaparezca, esta se suma a una variable global del form y va mostrando en un label cuando colisiona y en otro cuantos va esquivando. El trafico (array de imagenes) se crean en un ttimer cada 750 ms e incrementa una variable "CantidadTrafico" que se usa como referencia del array de images, estas van "avanzando" con un ttimer que ejecuta un bucle y dentro de el ejecuta "Trafico[i].Top:=Trafico[i].Top+1" siendo i equivalente a la variable "TraficoEliminado" que se enincrementa en uno cuando un autito fijo colisiona o lo esquiva.. Hasta aqui barbaro, al momento de verificar la colision hace "If (Trafico[x].Top + 66{alto del trafico}>= iAutito.Top) and (Trafico[x].Top<= iAutito.Top+44{alto del autito}) then" para saber si esta a la altura del choque y luego verifica en lugar del Top el paarmetro Left, si los valores del trafico estan dentro de los valores del autito este hace un Trafico[i].Free y elimina el TImage. Lo que necesito saber es como verificar a que componente del array se le hizo el Free ya que si el autito colisiona con algun trafico este debe validarse ya que el for que ejecuta el movimiento del trafico no lo sabe y cuando quiere acceder a un objeto eliminado me tira error.

Una cosa que probe pero que no funciono es el "if Trafico[i]=nil then exit".
Bueno, si alguno me puede dar una idea será bien recibida. Adjunto el .pas para que lo vean! y tambien parte del codigo debajo.


Creador de Imagen de trafico inicial y timer que mueve el trafico

Código Delphi [-]
procedure TfCoordinacion.btnCrearObjetosClick(Sender: TObject);
begin
CrearTrafico(CantidadTrafico,der);
Trafico[CantidadTrafico].Parent:=Self;
CantidadTrafico:=CantidadTrafico+1;
VelTrafico:= TTimer.Create(nil);
with VelTrafico do
begin
VelTrafico.Interval:=1;
VelTrafico.Enabled:=False;
OnTimer := VelTraficoTimer;
end;
VelTrafico.Enabled:=True;
tCreadorTrafico.Enabled:=True;
end;


Esto mueve el trafico creado y verifica si el top y el left del trafico esta dentro del autito y elimina el componente (esto no funciona bien :( )

Código Delphi [-]
procedure TfCoordinacion.VelTraficoTimer(Sender: TObject);
var i: integer;
begin
for i := TraficoEliminado to CantidadTrafico-1 do
  begin
   if Trafico[i]=nil then
      exit
  else
    Begin
   Trafico[i].Top:=Trafico[i].Top+1;
      Begin
    if ((Trafico[i].Top + 66>=iAutito.Top) and (Trafico[i].Top <= iAutito.Top+44)) or ((Trafico[i].Top + 66>=iAutito2.Top) and (Trafico[i].Top <= iAutito2.Top+44)) then
        if Trafico[i].Left + 44 in [iAutito.Left..(iAutito.Left+(iAutito.Height*2))] then
        Begin
          Trafico[i].Free;
          TraficoEliminado:=TraficoEliminado+1;
          Col:=Col+1;
          Label4.Caption:=IntToStr(col);
          exit;
        End;
      End;
    End;
   if Trafico[i].Top > (iAutito.Top + 50) then
    begin
     Trafico[i].Free;
     TraficoEliminado:=TraficoEliminado+1;
     Label1.Caption:=IntToStr(TraficoEliminado);
    end;
  end;
end;
Archivos Adjuntos
Tipo de Archivo: rar Autitos!.rar (1,5 KB, 2 visitas)
Responder Con Cita