Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con las linked list

Iniciado por Harko, 23 de Octubre de 2007, 06:19:32 PM

« anterior - próximo »

Harko

Taba tratando de implementar las listas en mi programilla pero como son clases y no structuras creo que me estoy liando un pelin :P

Primero pondre las funciones problematicas y luego la clase, asi no lleno demasiado esto ;). La idea es que a la que pulse la tecla se empiezen a crear disparos cual gatling escupiendo chorizos picantes.

Primero tengo la funcion de crear disparos:
void NewDisparo(){
 if (head==NULL){
   head=new disparo();
   fin=head;
   fin->SetNext(NULL);
   fin->LoadSprite();
 }else{
   fin->SetNext(new disparo());
   fin=fin->SeeNext();
   fin->SetNext(NULL);
   //fin->LoadSprite();
   fin->CloneSprite(head->Sprite());
 }
 fin->SetPosX(minave->PosX());
 fin->SetPosY(minave->PosY());
 fin->movimiento();
}

Le puse lo de clonar sprites porque no estoy seguro de si me dara problemas con el load. Una vez se crean ya toman su posicion y la direccion a la que van a ir por lo que no hay que tocarla mas que para moverla y destruirla si es el caso.

Luego tengo la funcion de dibujar cada bala. Esta es la que me esta dando problemas:
void DrawDisp(){
 disparo *p=NULL;
 p=head;
 if(head!=NULL){
 head->DrawDisparo();
 //fin->DrawDisparo();
 }
 /*while(p!=NULL){
   p->DrawDisparo();
   p->SetNext(p->SeeNext());
 }*/
}

Tal como esta funciona, aunque solo dibuja la primera bala. El problema es que si le digo que dibuje la ultima (fin) el programa se cierra y si le abro el bucle se cuelga:? De echo he comprobado que si abro el bucle y elimino el Draw se cuelga igualmente, es al recorrer la lista.

Os pongo la clase disparo para que le echeis un vistazo. La funcion movimiento lo que hace es que la bala se dirija hacia el punto a una velocidad controlada en la direccion en la que este, angulo es una variable global porque queria que apareciera en pantalla para controlar su valor.
class disparo{
 private:
 float x,y;
 float ang;
 CRM32Pro_CSprite *sdisparo;
 float velx, vely;
 disparo *next;

 public:
 disparo(){
   x=0;
   y=0;
   velx=0;
   vely=0;
   ang=0;
   sdisparo = new CRM32Pro_CSprite();
   next=NULL;
 }

 ~disparo(){
   delete sdisparo;
 }

 void movimiento(){
   float velabs=0;
   velx=mipunto->PosX()-minave->PosX();
   vely=mipunto->PosY()-minave->PosY();
   velabs=sqrt((velx*velx)+(vely*vely));
   velx=(velx/velabs)*2;
   vely=(vely/velabs)*2;
   ang=angle;
 }

 void LoadSprite(){
   //float angle;
   if(sdisparo->Load(IMG_RESOURCE,"disparo")==0){
     ILogSystem.Msg(LOG_NORMAL," · [LOG] - No se pudo cargar sprite Disparo: %s\n",SDL_GetError());
   }
   sdisparo->AutoRestore(0);
 }

 CRM32Pro_CSprite* Sprite(){
   return sdisparo;
 }
 void CloneSprite(CRM32Pro_CSprite *s){
   if(sdisparo->Clone(s)==0){
     ILogSystem.Msg(LOG_NORMAL," · [LOG] - No se pudo cargar clon Disparo: %s\n",SDL_GetError());
   }
 }

 void DeleteSprite(){ delete sdisparo; }

 void DrawDisparo(){
   sdisparo->SetPosition(x+=velx,y+=vely);
   sdisparo->SetEffect(SPREFFECT_ROTATE,0,ang);
   sdisparo->Draw();
 }

 void SetPosX(float px){ x=px; }
 void SetPosY(float py){ y=py; }

 void SetNext(disparo *n){ next=n; }
 disparo* SeeNext(){ return next;}

 float PosX(){ return x;}
 float PosY(){ return y;}
};
disparo *head = NULL;
disparo *fin = NULL;

Las funciones SetNext, para indicar cual es la siguiente clase a señalar, y SeeNext, para saber cual es la clase siguiente (si la hay), parecen funcionar correctamente por lo que he comprobado. Y CloneSprite no me ha dado errores por lo que supongo que tambien funciona bien.

Solo falta la funcion DeleteDisp, que recorre todas las clases eliminando los sprites. Lo gracioso es que la recorre exactamente igual que DrawDisp pero sin colgarse.
void DeleteDisp(){
 disparo *p=NULL;
 p=head;
 while(p!=NULL){
   p->DeleteSprite();
   p->SetNext(p->SeeNext());
 }
}


Ale, muchas gracias a los que hayais llegado al final de este ladrillo.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

Harko,
si me pasas el code te lo miro esta noche.

Ademas, eso de clonar el sprite es mejor que hacer toda una carga pero...para que lo clonas, porque no usas un solo sprite para todo?

saludos

Harko

Es por precaucion mas que nada. Como se van a crear un monton de disparos, cada uno con su clase, pues para que no me diga que no puede cargarlo varias veces lo clono. De echo ahora mismo estoy probando con sin el clone y funciona bien, puede que lo quite.

Por cierto, el problema aquel que me daba con el rotate ya esta solucionado del todo. Resulta que hacia el calculo despues de cargar la imagen, que es donde le modificava la rotacion. :P

He descubierto algo bastante curioso, si en el if de DrawDisparo añado estas lineas:
 p->SetNext(p->SeeNext());
 p->DrawDisparo();
la bala se acelera una que no veas, sobretodo si pongo varias. :lol:

Te pasare el cpp y el dpf, no creo que necesites la librerias ;) Por cierto, aun estoy trasteando con el CodeBlocks. Lo digo porque no es la primera vez que hace algo raro.

Harko.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

Te acabo de enviar un mail con el codigo retocado y una gran incognita que ya te tocara resolver a ti :)

Saludos!

Harko

Lo de eliminar los disparos era lo siguiente en la lista. Si te fijas nade tiene limites puedes mover la nave, el punto o los disparos fuera de la pantalla. Pero eso es lo mas sencillo (si no pasa nada raro :P)

Por cierto, las balas ya no rotan, solo la primera :? De echo cuando intento que roten los clones se cierra el programa.
-=Harko´s Blog=-
Fui el primer civil en probar el "Lord of Creatures" y ademas usaban mis cascos. :D

-=Portfolio=-

Alguno de mis juegos:
-=Feed The Frog=-

Neroncity

TheAzazel

no se...el codigo que te envie yo lo he compilado y funcionaba perfectamente, las balas cogian la rotacion adecuada con respecto al punto y ademas, lo pase un memory leaks checker para ver que no dejabamos nada por ahi...

luego te mando el exe para que lo compruebes tu mismo..

que version del gnu gcc estas usando? yo utilizo la 3.4 y paso olimpicamente de la 4.0. Aunque mis pruebas las hice con el visual studio 2003.

Saludos!

Mikenoworth

Maybe it's a bad compiler optimization that is setting off  the crash ??






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.