problemas con colision i otras funciones

Started by vib, February 21, 2011, 05:53:01 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

vib

Hola de nuevo...
re-abro el tema... por un problema que me surge con un codigo antiguo de este mismo post...
llevo toda la semana mirandolo el error con mi profe.. y lo unico que ha sabiado hacer él son debug sin llegar a nada...
Os pongo el cacho de codigo y lo que ocurre:
[code language="bennu"]process Item_Select_Screen_Background(grafico)
private
int txt = 0;
string vida_txt;
begin
   graph=grafico;
   size=400;
   x=400; //Fondo centrado
   y=50;

   //scroll[0].camera=id; 
   //ctype=c_scroll;   
   //cnumber=C_0;//le digo el mapa que quiero que se vea en este caso el 0, si no lo pusuera se veria en los 2 scroools.

   z=2;
   
   txt=write_var(0,400,100,4,vida_txt);

   loop
       vida_txt = "vida " + vida_2;
       frame;
   end

onexit:
    delete_text(txt);

end
[/code]
Bien este codigo es una copia de un codigo de aqui que me corregiste tu SplinterGU.

Hize un copi-paste ya que se adapataba perfecto a mis necesidades.. vamos.. resumidamente...
al crear el proceso me cree un grafico en un lugar de la pantalla... y un texto...

y que cuando matara el proceso.. pues desapareciera todo..

se hizo asi porque no sabia como coño borrar un texto sin borrar otros textos en pantalla....

El problema es.. que no va bien...pensaba que si.. pero haciendo pruebas he visto que aveces al crear el proceso.. se crea el grafico pero el texto no..
osea el texto no se crea... entonces cuando matas el proceso y va a onexit... al no haber la variable de delete_text(txt)
hace un delete_text de todo.. borrandome todos los textos de la pantalla...

La cosa es esa.. aveces el texto
[code language="bennu"]txt=write_var(0,400,100,4,vida_txt);

   loop
       vida_txt = "vida " + vida_2;
       frame;
   end

[/code]
No aparece...no tengo ni idea de porque.. he provado de canviarlo de sitio, de poner write_string(0,400,100,4,&vida_text)
de ponerlo fuera del proceso y ponerlo donde llamo para crear el proceso...
y nada aveces se escribe y aveces no.

SplinterGU

cuantos textos en pantallas tenes?

luego el delete text es tan simple con poner un if (txt) delete_text(txt);
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

El problema no es que cuando no aparezca el text me lo esborre todo.. el problema es que cuando creo el proceso.. pues 3 de cada 10 veces no sale el texto...
osea no me crea el texto...

SplinterGU

por eso te pregunto, cuantos textos en pantalla tenes? hay un limite, y si no tenes control que cada instancia se cree 1 vez, cuando lanzas 1 proceso texto, podes estar lanzando 100 o 200, y ahi te vas a quedar rapido sin textos disponibles y por ende te va a fallar, aunque vos solo veas un texto, porque se superponen entre si.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

ay limite?
pues haber en el momento de las pruebas tenia....8 textos..
2 en un loop que no pasaba anda si se borraban porque se volvian a crear.. y 6 sueltos..
cuando creaba el focus ese era el 9 textos...
y tengo una validacion para solo crear un proceso de focus.. osea como maximo ese es el 9.. aveces sale aveces no...

SplinterGU

no, lo maximo son 512 o 1024, algo asi.

pone un ejemplo compilable de tu codigo y lo vemos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

No hace falta... con lo que em digiste fue suficiente para arrecglarlo.. a menos a simple vista es asi..

no se me ocurrio antes.. quite los write de dentro el loop
i los saque a fuera.. y yata xD

claro en el loop se van creando llegan al cupo de escritos i plaf... ya no va...
mexi

SplinterGU

si, es eso.

pero el codigo que habias puesto aca (el mismo que puse yo) no tenia el write dentro del loop... imagino que lo tenias en otro proceso...

bien... ya me parecia raro... me alegro que ya lo tengas solucionado y comprendido.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Cuidado con los textos, son más difíciles de controlar que los procesos xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

Bienvenido a la programación orientada a objetos :D :D :D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

vib

BUenas de nuevo!
tengo un problemon...

Acabo de ver que no se pueden hacer colisions con diferentes types en un mismo proceso...eso es un gran problema que no se como solucion...

recordais el proceso rata()? lo uso para eso.. marcar a los diferentes enemigos como cualquier juego de rol... el caso esque todas las pruebas las he echo con 1 solo proceso...
Ahora al tener mas procesos a los que marcar "un total de 3 enemigos" me sale el problema...
Hoy lo he visto y llevo liado con eso pues toda la tarde... no hay manera...

Osea mi objetivo es.. con la rata si esta colisionando con enemigo1, al pichar me ejecute focus_enemigo1();
si la rata esta colisionando con enemigo2, al pichar me tiene de ejecutar focus_enemigo2();

La cosa esque solo funciona un colision por proceso...
ideas?

Os dejo el codigo de rata.. con algun comentario de pruebas...
[code language="bennu"]process rata()//el mouse normal y corriente
private
int col;
int col_1;
   BEGIN
      graph=4;
      ctype=c_scroll;
      z=mouse.z;
      
      //escritos orientativos.
      write(0,300,90,4,"movimiento rata x,y");
      write_var(0,300,100,4,x);//coordenadas de la rata
      write_var(0,300,110,4,y);
      write_var(0,100,100,4,id_2.x);// referencias enemigo 1 los de izkierda
      write_var(0,100,110,4,id_2.y);
      write_var(0,600,100,4,id_22.x);// referencia de enemigo2 los de derecha
      write_var(0,600,110,4,id_22.y);

      LOOP
         x=(mouse.x+scroll[0].x0);
         y=(mouse.y+scroll[0].y0);

         IF (key(_esc)) exit(); END

             ctype=c_scroll;
         //PRUEBAS
         //----------------
         //he intentado hacer 2 if... diciendole al proceso rata que si esta cercano a las coordenadas de id_2"enemigo1"
         //que haga la colision con ese proceso.
         //pero si esta mas cercano a id_22 "enemigo 2" pues que la colision la haga con el..
         //esta en comentario porque no me funciona tampoco
         /*if ((((x-id_2.x)<=10 and (x-id_2.x)>=0)) or (((id_2.x-x)<=10 and (id_2.x-x)>=0)) and ((y-id_2.y)<=10 and (y-id_2.y)>=0)  or ((id_2.y-y)<=10 and (id_2.y-y)>=0))
             
               col = collision (id_2);
         end
         if ((((x-id_22.x)<=10 and (x-id_22.x)>=0)) or (((id_22.x-x)<=10 and (id_22.x-x)>=0)) and ((y-id_22.y)<=10 and (y-id_22.y)>=0)  or ((id_22.y-y)<=10 and (id_22.y-y)>=0))
               debug;
               col_1 = collision (id_22);
         end*/
         //------------------
         col = collision (id_2);
         col_1 = collision (id_22);
         ctype=c_screen; x=(mouse.x); y=(mouse.y);

         IF (col) //si hay colision con proceso1, " es la unica que hay ya que es el 1r colision"
               IF (mouse.left) while (mouse.left)frame;end
                  IF ( exists ( type focus) );
                  else
                     focus();
                     marca(id_2.x,id_2.y);
                  end
            end
         else
            IF (mouse.left) while (mouse.left) frame;end
               IF ( exists ( type focus) )
                  signal(type focus,s_kill);
                  signal(type marca,s_kill);
               end
            end
         END
         IF (col_1) //si hubiera colision con el enemigo2.
               IF (mouse.left) while (mouse.left)frame;end
                  IF ( exists ( type focus) );
                  else
                     focus();
                     marca(id_22.x,id_22.y);
                  end
            end
         else
            IF (mouse.left) while (mouse.left) frame;end
               IF ( exists ( type focus) )
                  signal(type focus,s_kill);
                  signal(type marca,s_kill);
               end
            end
         END
        FRAME;
      END
   END[/code]
PD:si necesitais que os ponga un prg para ejecutarlo y tal decidmelo.. pero dios todo el esfuerzo para verme en esta situacion.

SplinterGU

si necesitas hacer mas de 1 collision por frame, necesitas recoger todos los collision de un tipo y luego todos los de otro, y luego otro, y asi sucesivamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

No te acabado de entender...
ya esta en 2 if.. es 1 o otro..
nose a que te refieres con los frames a las colisions _S

De momento la solucion que tengo..es super fea...si tengo 3 enemigos.. hacer 3 procesos de rata, uno encima de otro...
asi solo necesito hacer 1 colision por proceso.. PERO ES HORRIBLE! Xd

espero no tener de quedarse asi...
prefiero entender lo que me dices :D

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

realmente sigo sin entender...
es el ejemplo de colision con 1 proceso... me lo he mirado y nose.. no me abierto los ojos