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.

Drumpi

Con la z=-1000 debería bastar, te lo he dicho antes. Cualquier valor inferior a las Z de los procesos del minimapa ya vale.
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)

SplinterGU

vamos por partes...

1) las collisiones solo se hacen sobre graficos del mismo ctype.
2) con el mouse no te conviene usar collision, ya que solamente se chequea por 1 pixel, y este pixel es el pixel del centro o punto de control 0 del grafico del mouse, por ende no tiene sentido y te estas complciando la vida.
chequea por las coordenadas mouse.x y mouse.y sumando (o restando, segun compares) los valores del scroll y listo.
3) con respecto a la Z, usa ctype = c_screen y pone de z un valor -10000 o algun valor alto (mouse.z, quizas) y ya esta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

Vale no sabia que las colisiones solo se hacian sobre el mismo ctype. Entonces no me queda otra que usar digasemos la rata() en el mismo ctype que las cosas que quiero colisionar.

Eso implica, a que tienen todos de estar a una misma region? "es una duda" osea si haces 3 regions, la colision de la rata solo valdria para una de ellas?

luego con respeto al tema de la prioridad...

si necesito estar en el mismo ctype que las colisiones, he de estar en el scroll osea la opcion que tenia de c_screen y sumar y tal no me vale.

lo de la prioridad lo tengo asi

he provado con z, y con priority
[code language="bennu"]process rata()
BEGIN
   
    graph=15; 
    ctype=c_scroll;   
    z=-1000;
    //PRIORITY=1000;

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

Provando he visto cosas como...

la prioridad de z, solo surgen con los procesos que estan dentro del mismo ctype...

osea el mini-mapa que directamente esta en otra region y en el ctype=c_screen, y en el proceso de focus()"es el proceso que sale la vida del bicho etc" tambien esta en c_screen...

en ambos, la prioridad se la pasa por el forro, vamos que la rata queda por debajo de procesos con un z mas alto y que esten en c_screen.

Tambien queda por debajo de textos del mismo ctype teniendo la rata como veis prioridad maxima o z maxima....

Quizas sea un poco muy pesado con el tema..pero esta tan cerquita lo que quiero...simple tema de prioridad ..

espero que se alla entendido! :)

SplinterGU

region no se usa con collision, solo se usa ctype
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

z = mouse.z;

repito, priority es el orden de ejecucion, no de dibujado.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

Nada ;S

Visto lo visto... voy hacer una cosa.. os dejo el codigo para que lo probeis haber si asi se entiende mejor...
si el problema surge...espero que no porque no se que hacer ya.

Os comento. El codigo lo he dejado ordenado y he puesto los puntos que se han estado mencionando exclusivamente.
Una rata, un personaje, un "enemigo", los 3 en el mismo ctype que es c_scroll.

UN proceso que es focus, que esta en diferente ctype, es c_screen. Tambien he añadido algunos escritos como coordenadas  y eso.
El problema la rata queda por debajo de, los textos y del proceso focus "el que esta en diferente ctype.
yo quiero que quede por encima de todo y no hay manera.
Os envio el codigo, antes para que funcione.
teneis de hacer un archivo

scroll.fpg con 3 imagenes y sus numeros de asceso.
1-mapa "el scroll"
3-focus" la imagen que salga de referencia al hacer focus".
4-el cursor "la rata" o el mouse.

[code language="bennu"]import "mod_key";
import "mod_scroll";
import "mod_video";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
//PAG 379.Ñ..
process main()
private
int idfpg;

end
begin
set_mode(640,480,32);
idfpg=load_fpg("scroll.fpg");
start_scroll(0,idfpg,1,0,0,15);
//llamo procesos
proceso1();
proceso2();
rata();
loop
   write_var(0,20,10,4,scroll[0].x0);
   write_var(0,20,20,4,scroll[0].y0);

if(key(_q)) stop_scroll(0); end
if(key(_esc)) exit();end
frame;
end
end

process proceso1()//personaje principal
   begin
       scroll[0].camera=id;
       ctype=c_scroll;
       graph=new_map(30,30,32);map_clear(0,graph,rgb(255,255,255));
       x=320;y=240;
       z=1;
       loop

           if(key(_up)) y=y-5; end
           if(key(_down))y=y+5; end
           if(key(_left))x=x-5; end
           if(key(_right))x=x+5; end
       frame;
       end
   end
   
process proceso2()//enemigo al colisionar con rata y pcihar left sale focus.
   begin
       ctype=c_scroll;
       graph=new_map(30,30,32);map_clear(0,graph,rgb(255,255,0));
       x=220;y=200;
       z=1;
       loop
           if(key(_w)) y=y-5;end
           if(key(_s))y=y+5;end
           if(key(_a))x=x-5;end
           if(key(_d))x=x+5;end
       frame;
       end
   end
   
process rata()//el mouse normal y corriente
   BEGIN
       graph=4;
       ctype=c_scroll;    
       z=-10000;
       
       //escritos orientativos.
       write(0,300,90,4,"movimiento rata x,y");
       write_var(0,300,100,4,x);
       write_var(0,300,110,4,y);
       write(0,380,10,4,"scrool.x, scroll.y");
       write_var(0,300,10,4,scroll[0].x0);
       write_var(0,300,20,4,scroll[0].y0);
       LOOP
           x=(mouse.x+scroll[0].x0);            
           y=(mouse.y+scroll[0].y0);

           IF (key(_esc)) exit(); END
       
       
           IF (collision (TYPE proceso2)) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
               IF (mouse.left) while (mouse.left) frame;end
                   focus();
               end
           else
               IF (mouse.left) while (mouse.left) frame;end
                   signal(type focus,s_kill);
               end
           END
       FRAME;
       END
   END
   
process focus()
   private
   begin
       graph=3;
       size=400;
       x=400; //Fondo centrado
       y=50;
       z=2;
  loop
      frame;
  end

end
[/code]
Os agradezco de veras, mucho vuestra ayuda, os aseguro que os enseñare el juego y direis olé !!! ha merecido la pena :) xD

SplinterGU

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

vib

si arriba lo pongo

el archivo ha de estar en la misma carpeta  y con el nombre "scroll.fpg"

contiene  3 imagenes y sus numeros de asceso.
1-mapa "el scroll"
3-focus" la imagen que salga de referencia al hacer focus".
4-el cursor "la rata" o el mouse.

los graficos son nada cualquier dibujo tonto solo para que se vea..
o espera os las pongo yo, no hace falta que las hagas.

mapa scroll : http://img143.imageshack.us/i/primero.png/
"es mu xorra lo se xD"
personaje, enemigo y focus:  http://img339.imageshack.us/i/derecha1.png/

rata:  http://img195.imageshack.us/i/cuadroespada.png/

creo que es suficiente.

vib

#38
visto el exito...
mas facil.. os dejo el link de descargar..
solo descargar.. ejecutais el prg..
y lo miraris..si podeis :(

la cosa es clara.. la rata queda por debajo de los textos y del proceso focus que focus() se activa cuando pixas con la rata al enemigo...

ahi os lo dejo


http://www.mediafire.com/?c131c4vw4jek402

vib

Bueno veo que esto se ha quedado estancado Drumpi, SplinterGU

El caso lo he medio solucionado con una xapuza... me hubiera gustado haber sabido un buena manera...
lo que he echo es hacer un proceso rata_screen();
solo mostrando la rata... esta sale encima de la otra, poniendo su ctype=c_screen
cuando la rata normal se pone encima de un proceso c_screen queda por debajo, pero rata_screen por encima simulando la rata :)

Los textos siguen quedando por encima de la rata, no he sabido solucinar eso...si sabeis como ya sabeis sino nada

PD: os agradezco SplinterGU y Drumpi vuestro esfuerzo, he aprendido cosas interesante gracias a vosotros asi que por agradecimiento os he dado 1 de karma a cada uno que parece que eso se valora pos os lo regalo ;)

SplinterGU

ahora reviso el ejemplo, disculpa, pero estoy con mill cosas de trabajo... pero ahora me hago unos minutos.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

he visto tu codigo, mira, tu solucion esta bien, aunque tambien podrias directamente asignarle un grafico al mouse y trabajar con colision contra este.

te paso una modificacion de tu codigo, pero solo a modo didactico (hay algunos tips que te pueden ser utiles), tu solucion esta bien, una sugerencia, al proceso rata que esta detras, ponele alpha=0; asi directamente ni se ve, ni se dibuja.


import "mod_key";
import "mod_scroll";
import "mod_video";
import "mod_map";
import "mod_proc";
import "mod_grproc";
import "mod_text";
//PAG 379.Ñ..
process main()
private
int idfpg;

end
begin
set_mode(640,480,32);
idfpg=load_fpg("scroll.fpg");
start_scroll(0,idfpg,1,0,0,15);
//llamo procesos
proceso1();
proceso2();
rata();
loop
write_var(0,20,10,4,scroll[0].x0);
write_var(0,20,20,4,scroll[0].y0);

if(key(_q)) stop_scroll(0); end
if(key(_esc)) exit();end
frame;
end
end

process proceso1()//personaje principal
begin
scroll[0].camera=id;
ctype=c_scroll;
graph=3;
size=200;
x=320;y=240;
z=1;
loop

if(key(_up)) y=y-5; end
if(key(_down))y=y+5; end
if(key(_left))x=x-5; end
if(key(_right))x=x+5; end
frame;
end
end

process proceso2()//enemigo al colisionar con rata y pcihar left sale focus.
begin
ctype=c_scroll;
graph=3;
size=200;
x=300;y=400;
z=1;
loop
if(key(_w)) y=y-5;end
if(key(_s))y=y+5;end
if(key(_a))x=x-5;end
if(key(_d))x=x+5;end
frame;
end
end

process rata()//el mouse normal y corriente
private
int col;
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);
write_var(0,300,110,4,y);
write(0,380,10,4,"scrool.x, scroll.y");
write_var(0,300,10,4,scroll[0].x0);
write_var(0,300,20,4,scroll[0].y0);
LOOP
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);

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

        ctype=c_scroll;
        col = collision (TYPE proceso2);
ctype=c_screen; x=(mouse.x); y=(mouse.y);

IF (col) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
focus();
else
signal(type focus,s_kill);
END
        FRAME;
END
END

#define ONE_INSTANCE_OF_ME(t) while(p=get_id(type t))if(p!=id)return;end; end

process focus()
private
    p;
begin
    ONE_INSTANCE_OF_ME(focus);

    graph=3;
    size=400;
    x=400; //Fondo centrado
    y=50;
    z=2;

   loop
       frame;
   end

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

vib

Me as dejado alucinado!

Lo has clavado...
hay cosas por cierto que me han dejado sorprendio...
el cursors pasa por encima de todo asta los textos... eso he visto que lo has echo con z=mouse.z
estoy aluciando porque yo lo pruebo en mi codigo.. y no me funciona... hare copy /pega de es parte xD

Luego... he visto que en la rata canvias el ctype de la rata.. lo inicias en scroll y en el loop pasa de screen a scroll...
no sabia que daria ese efecto, ni lo habia pensado...
vamos que da? precisamente que este como en los 2 ctypes? mola

Lo 3r es la funcion que haces en el focus.. ONE_INSTANCE_OF_ME he estado buscando y no he encontrado nada imagino por el nombre.. que es una funcion para que ese proceso solo se active 1 vez y ya esta...
el define
#define ONE_INSTANCE_OF_ME(t) while(p=get_id(type t))if(p!=id)return;end; end
me ha dejado loco, vamos ni papa xD

total muxisimas gracias.. te doy otro karma.. y muy bien merecido.. realmente me has solucionado el problema en el que llevaba varias semanas peleandome
y el tema por mi ya puede cerrarse.. GRACIAS !!

SplinterGU

lo del ctype no es que este en los 2 ctypes al mismo tiempo, sino que para la funcion collision trabaja en el scroll y luego en el momento de dibujar lo hace en la screen.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Yo lo siento, pero ya no podía dedicarle más tiempo al código, estoy con otras cosas más importantes ahora mismo (como ganarme los garbanzos :D).

Respecto a lo de ONE_INSTANCE_FOR_ME es que ha usado define para crear una pequeña rutina, una especie de mini-proceso que contiene el código que le sigue, de forma que se pueda usar en los procesos como una función más (más o menos es lo que se entiende).

Aunque sigo sin entender por qué un proceso dentro de un cscroll no puede ponerse sobre otro cscroll sólo cambiando la Z. Con varios modos7 en la misma región funciona.
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)