FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
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
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 :( )
|
#2
|
||||
|
||||
No sé si podrás hacer esto:
En lugar de esto:
|
#3
|
||||
|
||||
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:
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" |
#4
|
||||
|
||||
Cita:
Cita:
¿Qué problema hay en utilizar FreeAnNil (o Free primero y luego asignar a NIL)? ¿Porqué lo desaconsejas (al contrario de lo que hago yo)? ¿Qué ventaja puede tener dejar la variable apuntando a "nosesabedonde" en lugar de apuntar a nil?
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#5
|
||||
|
||||
Hay montones de hilos de "debate sobre religion" acerca de Free vs FreeAndNil
Por ejemplo Nick Hodges da algunas buenas razones para no usar FreeAndNil como una "receta magica que solucionara todos tus problemas" Considera este ejemplo:
Obviamente falla, ya que como bien decis, al no haber asignado nil al puntero Query, si bien la memoria fue liberada, sigue apuntando a "quiensabedonde": Query es distinto de NIL, entra en el bloque try-finally, y en la primer linea se rompe No me gustaria proponer en ese caso "solucionarlo" con un FreeAndNil; porque si bien, el codigo va a funcionar, el problema es otro 1. Si se va a crear/destruir el query en cada ejecucion del metodo, porque esta declarado en la seccion private del Form? No seria mejor que este declarado local en el metodo? Mientras mas limitado el alcance de las variables, mejor 2. Si es necesario que este declarado como variable del Form porque se usa en otros metodos, porque hay que estar liberando la memoria en cada llamada al boton? 3. Osea que todo el codigo que use el objeto Query, va a tener que estar protegido con un chequeo contra NIL. Ahora bien, pregunto: Por que cuando se usa el TADOQuery soltando el componente en el Form no regamos el codigo con chequeos contra NIL? No es mucho mas claro y sano ver esto?
|
#6
|
||||
|
||||
Me parece que estás mezclando peras con manzanas: estás criticando el uso de FreeAndNil poniendo un ejemplo en donde el menor de los problemas es la falta de uso de ese procedimiento. Por otra parte, esto (que tampoco viene mucho al caso)
Cita:
Más aún, si ese Query se va a destruir en el destructor del formulario, mejor lo creamos poniendo al formulario como owner y nos ahorramos llamar el Free. Claro que entonces, lo mismo habría sido insertar el componente LineComment Saludos |
#7
|
||||
|
||||
Es que lo que me estáis diciendo es algo así como:
..."Si usas FreeAndNil es que tu código está mal diseñado". ..."necesitas el FreeAndNil para que no pete". No estoy de acuerdo. El código estará bien o mal diseñado y se podrá usar o no FreeAndNil, pero no creo que tenga que ver lo uno con lo otro. Habrá quien llene el código de variables globales, que no usará parámetros en los procedimientos y que duplicará decenas de líneas de código y al final usará FreeAndNil, y habrá quien lo diseñe correctamente y utilice Free. Pero tal vez habrá quien haga lo segundo y utilice FreeAndNil (que es lo que intento hacer yo, por ejemplo). Es una costumbre, a mi entender, de programación clara. Habrá quien lo considere innecesario, a mi me parece "ordenado". Admito que es una cuestión de gustos, pero si las cosas están correctas, tan correcto es usarlo como no hacerlo. NOTA: Ahora veo la respuesta de Román, y creo que más o menos es lo que intento explcar yo.
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
verificar existencia de archivo txt | JuanOrtega | Varios | 3 | 20-10-2011 10:51:19 |
Verificar la Existencia de un Archivo | sidneyb | Varios | 2 | 22-04-2008 22:16:19 |
verificar existencia antes de insertar | sidneyb | SQL | 7 | 10-03-2008 15:26:50 |
Copiar Bitmap de un TImage a otro TImage | quinqui | Gráficos | 2 | 24-01-2008 15:22:30 |
verificar la existencia de una base de datos | gushmaish | Conexión con bases de datos | 3 | 20-02-2007 15:08:16 |
|