Problema con collision

Started by Zergling, December 18, 2009, 11:15:25 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Zergling

Hola a todos, la verdad es que es la primera vez que escribo aquí. Espero que a partir de ahora mi intervención en estos foros sea más asidua.

Vamos a ver, tengo un proceso controlado con el raton que marca un área con un gráfico en la que si colisiona con un proceso tipo Base le envío a un proceso llamado Interconexion2, la id del proceso Base. Y si colisiona con un proceso Interconexion2 le envía la id del proceso a un proceso Interconexion2.

Dicho así suena lioso, por eso voy a poner aquí el código.

         graph = 7;      
         col2 = collision(TYPE Interconexion2);
         if((col2)&&(mouse.left))
            idmodo = Interconexion2(x,y,col2);
         end         
         col = collision(TYPE Base);
         if((col)&&(mouse.left))            
            idmodo = Interconexion2(x,y,col);
         end   


Tengo puestos un par de write_var para ver qué pasa con las variables col y col2 y siempre me dan como resultado, la id del proceso Base aunque el gráfico esté colisionando con un proceso Interconexion2.

¿Ha cambiado algo el collision de Fenix a Bennu? ¿Sabe alguien porqué puede pasar esto?

Lo cierto es que llevo ya muchas horas probando cosas y no consigo resolver esto.

Muchas gracias a todos.

Windgate

collision funciona bien y no da resultados raros, siempre devuelve el id del proceso con el que se ha colisionado...

De todas formas, como no entiendo muy bien lo que pretendes, prueba a hacerlo así:

IF ( col2 = collision ( TYPE interconexion2 ) )
...


Ya que así puedes poner el comportamiento cuando hay colisión y con un ELSE poner el comportamiento cuando NO la hay. Te recomiendo que trabajes con collision siempre usando un IF.
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

Zergling

Ante todo muchas gracias Windgate, he estado probando como me decías y nanai, se me está resistiendo esto que en teoría es una tontería...

En aras de poder reproducir el error con mayor fidelidad, he creado un ejemplo de lo que me pasa:

Import "mod_video";
Import "mod_map";
Import "mod_draw";
Import "mod_key";
Import "mod_screen";
Import "mod_text";
Import "mod_grproc";
Import "mod_math";
Import "mod_mem";
Import "mod_proc";

global
   int idbase;
   int interconexiones=0;
end
process Interconexion2(int ax, int ay, int id)
begin
   graph = graph = new_map(10,10,32);
   map_clear(0,graph,rgb(128,18,128));
   x = ax;
   y = ay;   
   CrearCon(x,y,id.x,id.y);
   loop
      if(key(_esc)) break; end
      frame;
   end
   
end
process Main()
begin
   set_mode(800,600,32);   
   Base();
   Puntero();   
   loop
      if(key(_esc)) break; end
      frame;
   end   
end
process Puntero()
private    
   int col, col2; //Variable para guardar el collision después de hacer el primer click
begin   
   graph = graph = new_map(50,50,32);
   map_clear(0,graph,rgb(128,128,128));
   write_var(0,100,100,4,col);
   write_var(0,100,130,4,col2);
   loop
      x = mouse.x;
      y = mouse.y;
         //col2 = collision(TYPE Interconexion2);
         if((col2 = collision(TYPE Interconexion2))&&(mouse.left))
            Interconexion2(x,y,col2);            
         end               
         //col = collision(TYPE Base);
         if((col = collision(TYPE Base))&&(mouse.left))            
            Interconexion2(x,y,col);            
            interconexiones++;            
         end   
      if(key(_esc)) break; end
      frame;
   end   
end
process Base()
begin
   graph = new_map(50,50,32);
   map_clear(0,graph,rgb(255,255,0));
   x = 500;
   y = 500;
   loop
      if(key(_esc)) breaK; end
      frame;
   end
end
function CrearCon(int xorigen, int yorigen, int xdestino,int ydestino)
private
   int rayo;
end
begin   
   drawing_map(0,0);
   drawing_color(rgba(0,128,0,255));
   draw_line(xorigen,yorigen,xdestino,ydestino);
end


Perdonad por los imports, pero no me iba a poner a comprobar todo el código. Este código podéis copiarlo y funciona perfectamente sin fpg ni nada y reproduce mi error. Que seguro que es alguna chorrada que me he comido por ahí pero es que llevo ya horas y no lo encuentro.

La cuestión es sencilla, desde el proceso puntero si colisiona con la base creo un proceso interconexión desde donde se llama a una función que pinta una línea hasta la base. El problema está en que si colisiona con una interconexión la línea quiero que la pinte hacia la interconexión no hacia la base, por eso le paso la variable col2 y no la col a secas.

Como se puede ver en el ejemplo con los write_vars col y col2 dan el mismo resultado se apunte hacia la base o hacia una interconexión y la verdad es que como nunca había tenido problemas con el collision me pilla un poco descolocado.

El objetivo de este ejemplo sería poder crear una red de interconexiones a partir de la base.

Agradeceré muchísimo vuestra ayuda.

Un saludo.




Windgate

Uf, no sé si es porque me pillas espeso, pero no entiendo bien el código y tanto proceso...

Recuerda que collision detecta colisión entre el proceso que invoca collision y cualquier proceso del TYPE pasado como parámetro, ¿Seguro que quieres detectar la colisión con el proceso que invoca collision y no con otro proceso?

Es que veo mucho proceso e intercambio de ids... También recomendaría tener un proceso que gestione el mouse y nada más, un proceso que hace 2 cosas a la vez lía mucho el código como para entenderlo...
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

Zergling

La verdad es que intentando simplificar el ejemplo, he quitado más código y ahora funciona, pero no consigo entender porqué.

Muchas gracias por todo Windgate, cuando tenga la solución la postearé aquí para que a otro no le pase lo mismo. Pero la verdad es que ahora mismo, no tengo ni idea de porqué funciona o no.

Zergling

Estoy subnormal...

Ya sé porqué es, la cuestión es que desde Interconexion2, declaraba una variable llamada id, no me di cuenta de que estaba reservada. Si cambiamos la variable a id2, por ejemplo, el ejemplo funciona perfectamente.

Un saludo a todos.

Cuando lo tenga terminado ya os lo enseñaré.

Windgate

Oh, cierto, a mí también me pasó en su día... Es que hay tantas LOCAL que al principio armas algunos pollos repitiendo nombres... Hace no mucho quería poner unas PRIVATE float x,y,z; y también tuve problemitas :P

En teoría las últimas DLL de Bennu ya avisan del error de compilación si redeclaras una variable...
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

Zergling

Tengo problemas muchas veces con cosas como estas. Mezclo el visual, el c y el c# como si fuese una ensalada.

Luego llego a esto y claro... jejeje.

El problema estaba en que me daba el problema en otro proceso, entonces claro, no se me ocurría pensar en el que daba el error. Fue gracias a que quise reducir el error en código para que fuese más legible, y al quitar una cosa que en principio no tenía que ver, fue cuando me funcionó.

Muchas gracias de todas formas.

FreeYourMind


SplinterGU

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

Zergling

Pues la verdad es que no lo sé, pero me instalé el bennupack 1.7.

josebita

Ponte el 1.8.

PD: ¡Bienvenido! :)