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.

SplinterGU

bien, explico... (aunque veo que no es el problema, el problema lo describo abajo)

collision es una funcion que recorre todos los procesos que estan colisionando contra el proceso actual, esta lista se reinicia por 2 motivos:

1) instruccion frame
2) collision a otro tipo de proceso u otro proceso o proceso 0 (ALL)


este es tu problema:

por otro lado, si vos en el else del primer collision haces una espera hasta que se suelte el boton izquierdo del mouse y luego en el if de la colision siguiente pretendes que para que se active la logica de la 2da colision este el boton izquierdo pulsado, entonces estamos en un gran problema ya que el boton dejo de estar pulsado para seguir.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

Mmm...
cierto la collision veo que funciona "entre comillas"
si justo hacer la collision llamo a los procesos que deseo llamar sin pichar la tecla del mouse. y funciona...
claro nose al quitar el colision con la rata para matar los procesos creados.. se me sale el juego..

Aunque no acabo de entender porque lo de pichar con la rata no funciona? y que solucion podria haber?:S

Drumpi

No sé si esos dos procesos con los que colisiona la rata son del mismo tipo o no, pero yo siempre uso collision con tipos, no con IDs:

id_colisionado=COLLISION (TYPE nombre_proceso_a_colisionar);

Esto te devuelve cada vez que lo llamas la ID de cada proceso "nombre_proceso_a_colisionar" con la que choca. Si tienes, por ejemplo, tres procesos "rata" y sólo choca con una, te devuelve su ID y no necesitas comprobar las demás, porque ya lo ha hecho. Si lo metes en un bucle, puedes obtener las diversas ID hasta que te de 0.
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

Ya he solucionado el problema.. al menos creo...
Pensando en lo que me habeis dicho...
lo he echo me ha funcionado...

Os pongo el trozo de codigo que he modificado
[code language="bennu"]IF (col) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
               IF (mouse.left) while (mouse.left)frame;end
                  IF ( va_focus==1 );
                  else
                  if(txt)
                  delete_text(txt);
                  end   
                     signal(type focus,s_kill);
                  signal(type marca,s_kill);
                  va_focus=1;
                     focus();
                     marca(id_2.x,id_2.y);
                  
                  end
               end
         else
            IF (mouse.left) //while (mouse.left) frame;end
               IF ( exists ( type focus) and va_focus==1 )
                  delete_text(txt);
                  signal(type focus,s_kill);
                  signal(type marca,s_kill);
                  va_focus=0;
               end
            end
         END
           if( (col = collision(type proceso2)))
            text2 = "collision 2: " + col;
            text22 = " no collision 22: " + col_1;
         elseif((col_1 = collision(type proceso22)))
            text2 = "no collision 2: " + col;
            text22 = "collision 22: " + col_1;
         else
         text2 = "no collision 2: " + col;
         text22 = " no collision 22: " + col_1;
            text = "no collision";
        end
         
         IF (col_1) //si hay colision, saldra con el focus, sino lo hay puedes quitar el proceso.
            IF (mouse.left) while (mouse.left)frame;end
                  IF ( va_focus==2 );
                  else
                  if(txt)
                  delete_text(txt);
                  end   
                     signal(type focus,s_kill);
                  signal(type marca,s_kill);
                  va_focus=2;
                     focus();
                     marca(id_22.x,id_22.y);
                  
                  end
            end
         else
            IF (mouse.left) //while (mouse.left) frame;end
               IF ( exists ( type focus) and va_focus==2)
                  delete_text(txt);
                  signal(type focus,s_kill);
                  signal(type marca,s_kill);
                  va_focus=0;
               end
            end
         END[/code]
Vamos resumiendo.. he puesto la variable va_focus "es simplemente una variable que determina a quien estoy focuseando"

La cosa es.. simplemente del codigo anterior a este solo he modificado la tonteria de los else.. osea cuando no hya colision le he quitado el while... de frames....

realmente asi me funciona al menos eso parece...haciendo referencia a lo que me has dicho de los frames con las colisiones...

La cosa es.. me funciona muy bonito, pero...porque? no lo entiendo porque quitando esa parte me funciona? osea me gustaria saber como funciona el rollo de colisions con los frames, no lo acabado de entender y no he entendido porque quitando los whiles [code language="bennu"]//while (mouse.left) frame;end [/code] del else me funciona... me gustaria saberlo :D

gracias:D

SplinterGU

por que con eso, estas esperando a que se suelte el boton para continuar, y paso seguido a eso (una vez soltado el boton), para que la siguiente condicion se cumpla tenes que tener el boton presionado, pero como va a estar presionado si vos hiciste una pausa hasta que el boton se suelte?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

juas.. debo ser un poco tonto..
xD
mm si es cierto lo que dices pero.. cuando lo suelto... se acaba el while y todo vuelve a la normalidad... asta que no lo vuelva a apretar...
Porque se mantiene pulsado mientras este en el while, osea mientras lo pulse...
no entiendo lo que me quieres decir porque yo lo veo asi.. no se que tiene que ver este while.. con el problema.. porque ala que lo suelto se quita la pausa..entonces puede volver a pulsarse.S:

Drumpi

A ver, cuando llamas a collision, internamente se genera una lista de procesos con los que choca el que lo llama. Pero claro, collision no te puede devolver todos los IDs de golpe, sólo te puede devolver un valor, como todas las funciones.
Entonces, lo que hace es que cada vez que lo llamas, te devuelve un valor distinto de esa lista, hasta que se acaba y te devuelve cero.

Lo que pasa, es que la lista se genera dependiendo del valor que le pases: si le pasas la ID de un proceso, la lista tendrá un único elemento, si usas TYPE la lista contendrá todos los procesos existentes con ese nombre que colisionen con tu proceso, y si le pasas cero, pues no tendrá un filtro.

Pero esta lista la mira en orden, y no se puede volver atrás. La única forma de leer la lista desde el principio es que el proceso haga un frame o cambies de TYPE para que genere una nueva lista.

Otra cosa: no veo claro usar TYPE con SIGNAL, se supone que las señales se mandan a un proceso determinado, y TYPE indica "a un proceso cualquiera con ese nombre" (supongo que sabes que se pueden generar diversos procesos con el mismo nombre, por ejemplo, "rata" ¿no?). Si tienes un único proceso, bien, pero a poco que tengas más de uno, no sabes a cuál va a ir dirigido.
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

drumpi, estas mezclando las cosas...

aca no entiende el while... a ver... ya no se como explicarlo... voy a intertar de nuevo... con pseudocodigo...

- si colisiono1 entonces,
         - me fijo si tengo pulsado el boton del mouse
                 - lo tengo, asi que espero a que lo suelte para continuar
                 - creo proceso focus
- si no colisiona1 (else del if anterior)
         - me fijo si tengo pulsado el boton del mouse
                 - lo tengo, asi que espero a que lo suelte para continuar
                 - elimino el proceso focus

(para este entonces ya el boton del mouse esta sin pulsar, porque de eso me encargue con los whiles del if y else anterior)
         
- si colisiono2 entonces,
         - me fijo si tengo pulsado el boton del mouse (no lo voy a tener porque en el if y else anterior me asegure de que no este pulsado para seguir)
                 - lo tengo, asi que espero a que lo suelte para continuar
                 - creo proceso focus
- si no colisiona2 (else del if anterior)
         - me fijo si tengo pulsado el boton del mouse (no lo voy a tener porque en el if y else anterior me asegure de que no este pulsado para seguir)
                 - lo tengo, asi que espero a que lo suelte para continuar
                 - elimino el proceso focus

---

si no se entiende ahi, yo me doy por vencido... a ver si algun otro lo puede explicar...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

Vale veo que no se reinicia digamos... okis..
luego lo que hago es matar todos los procesos de focus.. si se lo que me hago.. xD
Mas o menos ya os estoy entendiendo.
Realmente con lo que me dices Drumpi de hacer collision con el proceso o con su id.. realmente noto que me da los mismo valores..

BUeno el caso esque noto que la idea de hacer una rata normal y corriente me da muchos problemas...

SI... no esta del todo resuelto como dije antes.. parecia que iva bien pero no.

Vamos por partes...

Tal y como lo tengo ahora.. osea como lo mostre anteriormente que dije que me iva...tiene pequeños problemas bastante raros a mi entender.

Todo funciona correctamente... hace sus 2 colisiones con los 2 procesos diferentes, estos procesos se mueven.. y al canviar de posicion sigue funcionando... PROBLEMA...
Cuando el que se mueve soy yo osea mi proceso estando en un scroll que la camara le sigue.

La colision varia...Haber si me explico: me explicare refiriendome a 1 proceso al que se le pueda hacer focus.. realmente me pasa con los 2.

enemigo"para hacer el focus": tiene las coordenadas x=10 y=10
prota: "el proceso que la cara le sigue por el mapa..."

a primeras.. hago el colision con la rata a proceso enemigo, correctamente...
prota se mueve quedandose en la coordenada  y=y+20

Una vez me he movida he perdido la referencia a la colision con enemigo...
ahora si quiero hacer colision enemigo tiene de ser en la coordenada x=10 y=30
osea.. la colision con los enemigos se mueve junto con el personaje...

Una vez pasa esto.. muevo el enemigo... pues su colision se mueve tmb quedandose siempre perdida como pongo arriba.

------------------------
Esto es un problema que nose porque me lo da.. con el codigo que puse arriba espero que se entienda.
---
2n problema...
--
Dado este problema.. se me ocurrio una grandiosa idea...
Envez de hacerlo tan lioso con las colisiones en el proceso rata...hacerlo al reves los procesos de enemigo tuvieran el colision con la rata...
una vez colisionara se pusiera una variable a true/false que en el proceso rata.. hiciera que creara el respectivo proceso de focus...

Esto a papel era una gran idea.. y la implemente...y salio un problema ..

La colision no funcionaba...
El codigo importante de la rata en este caso es el siguiente:
[code language="bennu"]
x=(mouse.x+scroll[0].x0);
y=(mouse.y+scroll[0].y0);
             ctype=c_scroll;

         ctype=c_screen;
         x=(mouse.x); y=(mouse.y);[/code]
Visto esto que me enseñastes tu SplinterGU  pasa algo que haciendo las colisions en el proceso rata no pasaba..

que el los otros procesos no detecta la colision con la rata...
haciendo pruebas quito la linea  [code language="bennu"]type=c_screen;
         x=(mouse.x); y=(mouse.y);[/code]
Asi si que funciona el colision...osea vamos no lo detecta por el canvio a c_screen dado que antes si funcionaba..
Con esto pasa el problema de.. la rata se queda por debajo de los procesos que he de poner en c_screen.

No entiendo porque desde rata funciona y de los otros no funciona...

SI lo se, es un puto lio....Espero que este laberinto de hacer la rata llegue a buen puerto :( xD

SplinterGU

jejeje... se te esta complicando un poco la cosa...

los 2 ctype seguidos no tiene sentido, lo que yo te mostre es un truco sucio que lleva entre medio un frame, cuando va al frame tiene que tener c_screen, en la logica tiene c_scroll.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

Lo puse asi porque.. antes ahi en medio antes de volver a llamar a c_screen habia la colision...
pero claro en ese problema la colision la hago con el proceso enemigo.. y no lo detecta porque siempre da con que rata es c_screen y no estan por tanto en el mismo ctype.. ahi es donde hay el problema :S

SplinterGU

claro... pero si usas el doble proceso, el rata con c_screen para dibujarlo y un rata c_scroll para las colisiones no vas a tener problema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

ostias cierto que tonto.. no me acordaba de eso xD
mas que nada porque la semana pasada se me revento la particion de linux y perdi todos los datos que tenia y claro me tuve d eponer hacerlo todo xD
es otra historia..

si con el doble proceso lo he provado y funciona perfectamente...

aunque claro la idea era hacer una rata bien echa no una chapuza..xD
POrque mi juego es de pocos procesos.. pero imagino que en un juego tocho la chapuza de hacer 2 procesos para una rata estaria bastante mal no? ja que carga inutilmente la memoria y nose si seria bueno hacerlo asi...

o estoy exagerando y esta forma de hacer la rata la puedo usar siempre?

SplinterGU

es 1 solo proceso el que va arriba de los textos, el resto no.

eso no significa mucha carga.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

vib

bueno es rata(); rata_screen(); pero si por 1 mas...

bueno ahora me tengo de dedicar a unir todo el codigo que espero que no me de mas problemas por favor xD y ya la semana que viene lo tengo de tener finitikao...y ya os lo subire para que lo veais!