Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con Entidad2dmanager->Delete()

Iniciado por Angus, 10 de Junio de 2006, 11:58:54 PM

« anterior - próximo »

Angus

Primero, felicitaciones por la lib.

Mi problema es muy sencillo, acá va un pedazo de código:

// Entidad
LOV_Entity2d  entidad1;
Entidad2dManager->Add(&entidad1); // Añadir la entidad

// Quitar la entidad del manager
Entidad2dManager->Delete(&entidad1);


Me da el error típico de windows, y en el log del Debug se corta así:
Citar
[19:50:17] [ BEGIN ] -- Liberando entidad --
                   {

Saludos y gracias desde ya.

Edit:
Probé algunas cosas, y resulta que si lo compilo con el Microsoft Visual C++ 6.0 me va bien, pero si lo compilo con el Microsoft Visual C++ 2005 no. Probablemente sea alguna configuración del proyecto, pero no estoy seguro :(

Loover

Perdón por tardar tanto en responder. Increiblemente no vi el post. Para alguien que escribe aquí y no me encargo de él. Lo siento de veras.

El código que has puesto, no debería dar ningún error. La librería efectivamente está compilada con vc++ 6. No sé si será algún error del proyecto o simplemente un error que ocurre al ejecutarla en una aplicación compilada con Microsoft Visual C++ 2005.

¿Lograste subsanar el error?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Angus

No hay problema con que te hayas tardado, aproveché el tiempo para ver el source y aprender de él.

No, no logré arreglar eso. Es raro, porque hasta abrí un ejemplo donde usa esa función (el ejemplo hecho en vc++ 6) con el vc++ 8, y le di que convierta el proyecto a la versión 2005, y tampoco anda. No se me ocurre que puede ser, y ese es el único inconveniente que tuve, por el resto todo bien.

De última podría usar el vc++ 6, ya que uso el 2005 por algunas comodidades extras que me brinda, pero me sorpendió el error.

Una pregunta aparte, le hice algunos cambios a la lib y cuando quize compilarla, es como que en los includes toma el path, desde donde se encuentra el mismo archivo, en vez de donde se encuentra el proyecto, por ejemplo:

Proyecto
C:\Proyecto\Proyecto.dsw
C:\Proyecto\Proyecto.dsp

Source:
C:\Proyecto\Source\source.cpp
C:\Proyecto\Header\header.h

Y en el source.cpp tengo:
#include "Header\header.h"

Y no me lo acepta, porque para que lo acepte, el header.h se tendría que encontrar acá:
C:\Proyecto\Source\Header\header.h

Quisiera saber como solucionar esto también, si es posible.

Saludos y gracias.

Loover

Creo que ya sé donde está el problema con el Delete. En cuanto pueda lo arreglo y lo subo.

Un saludo.
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Angus

Sí, por favor, porque ahora que pruebo, cuando le paso el exe a otras computadoras no les anda, y es cuando se ejecuta esa función.

Saludos.

Angus

Creo que encontré el error, pero no logro compilar la librería :(.

Acá estaría el error:

int i = 0;
for (mEntityListIter  = mListEntities2d.begin();
i < mNumEntities;
mEntityListIter++)
{
if ((*mEntityListIter) == pEn)
{
mIs = 1;
mListEntities2d.erase (mEntityListIter);
mNumEntities--;
}
i++;
}


Debería ser así, creo yo:

for (mEntityListIter  = mListEntities2d.begin();
mEntityListIter != mListEntities2d.end()
mEntityListIter++)
{
if ((*mEntityListIter) == pEn)
{
mIs = 1;
mListEntities2d.erase (mEntityListIter);
mNumEntities--;
break ;
}
}


Ya que lo que hace antes es seguir iterando una lista de la que se le quita un valor dentro del loop, y da error al seguir iterando. De todos modos no tiene sentido seguir iterando, ya que no va a haber 2 entidades iguales. Y en caso de que haya, debería hacerse de otra forma (con una función recursiva quizás).

Lo mismo pasa con este código:

/*
==================
Borramos la imagen de la lista
==================
*/
void LOV_Entity2dManager::DelFromList (LOV_Entity2d *pEn)
{
// Reccoremos la lista buscando el elemento a borrar
vector <LOV_Entity2d*>::iterator mIter;
for (mIter  = mListEntities2d.begin();
mIter != mListEntities2d.end();
mIter++)
{
if ((*mIter) == pEn)
mListEntities2d.erase (mIter);
}

pEn = 0;
}

Le falta el break para terminar el loop, sigue iterando una lista de la cual se le quitó un elemento.

Saludos, voy a seguir intentando compilarla de todas formas, ya que me gustó mucho esta dll, jeje.

Angus

Bueno, logré compilarla y arreglar eso, ahora me funciona todo perfecto y puedo compilar en el Visual 2005, y mejor aún, la DLL quedó como 300kb más chica.

Otra cosa que modifiqué, es la función ZisLess, que está definida en el mismo archivo de cabecera, cuando es mejor solamente declararla ahí, y definirla en el .cpp, sino luego te da unos errores de linker, cómo se ve en este thread:
http://www.stratos-ad.com/forums/index.php?act=ST&f=40&t=4347&s=8b39e6e1401239a292e7c71dd98c259f
(Ver último post de la primera página).

Saludos!

Loover

Buenas Angus,

Lamento tardar tanto en cada respuesta y ser tan poco de ayuda pero la verdad es que estoy bastante liado.

Es genial el trabajo que estás haciendo, tienes razón en todo lo que has dicho. Incluso creo que ese bug se repite en el resto de los manager. Pero me alegro de que tenga fácil solución.

En cuánto en que has logrado compilarla para Visual 2005 es un logro brutal, sería genial poder subir esa versión a la web.

Podría darte si estas interesado, acceso al ftp y así cambiar lo que se te antoje y subir tus propias pruebas, etc. Estás haciendo mucho por esta librería.

Me gustaría si quieres, que me agregaras al msn [javidrislo((ARROBA))hotmail((PUNTO))com]

Por cierto, ¿estás haciendo algún proyecto con ella? ¿un juego?
IndieLib Libreria 2.5d utilizando aceleración por hardware para la programación de juegos 2d.
Indie Rover The monkeys are reading!

Angus

Bueno, ya te agregué, nos vemos por el msn entonces ;)

Saludos!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.