Procesos y variables

Started by gecko, January 29, 2010, 06:15:22 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

gecko

Tengo un problemita que me esta complicando un poco...

El tema es asi: tengo 2 procesos no relacionados entre si (no son padres, ni hijos, ni nada) y cuando colisionan entre ellos AMBOS tienen datos que al otro proceso le sirven.

Siendo mas claro, tengo un proceso disparo() y un proceso enemigo(). El proceso disparo tiene una variable local daño (que cambia en cada proceso) que es lo que debería descontar a la variable local vida del enemigo cuando ambos colisionan.

Probe usando unas variables globales que guardan el daño y la ID del enemigo tocado, pero si tengo varias colisiones en el mismo frame algunas se pierden...

Probe usando variables publicas, pero no puedo conseguir que funcione, creo que las estoy declarando mal...

Hay alguna forma de pasar parametros de un proceso a otro? o tengo que seguir intentando con variables publicas?

gracias!...
Torres Baldi Studio
http://torresbaldi.com

DCelso

Creo que no estás haciendo un while en tu bucle de colisiones sino un simple if, pero de todas formas puedes mejorarlo haciendo esto.
en vez  de variables locales en los procesos, usa variables public. y haz lo siguiente
en el proceso que va a llevar el control de colisión. Por ejemplo el proceso disparo.
creas una variable de tipo del proceso enemigo y entonces capturas la colision de tipo enemigo y la guardas aqui y luego pones el nombre de la variable del proceso enemio, un punto y el nombre de la variable public del disparo para hacer referencia a esta. A ver si me sale el ejemplo:

process p_disparo()
public
   int daño;
Begin
  frame;
end 

process p_enemigo()
private
   int energia;
   p_disparo id_disparo;
begin
  id_disparo =  collision(type p_disparo);
  while (id_disparo)
     energia = energia - id_disparo.daño;
     id_disparo =  collision(type p_disparo);     
  end 
  frame;
end

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

gecko

Muchas gracias che! Gracias por la ayuda y el ejemplo. Funciona. Un detalle es que tengo que escribir los procesos en ese orden sino no funciona. Lo de declarar una variable pública como proceso (o algo así creo es lo que hiciste) no lo entendí mucho, supongo tengo que aprender algunos conceptos más sobre variables públicas, pero por ahora ese código funciona bárbaro, jaja.
Saludos!
Torres Baldi Studio
http://torresbaldi.com

DCelso

#3
con variables locales funcionaría exactamente igual, si puedes recuperar tu ejemplo anterior, solo necesitarías cambiar el if colision por un while collision y no perderías ninguno de los impactos, que creo que es lo que comentabas que te pasaba antes.

osea algo como

if (collision(type disparo))
   ...
end
...
frame

por

id_colision = collision(type disparo);
while (id_colision)
   ...
  id_colision = collision(type disparo);
...
end
frame


en el primer caso solo haces una comprobación en cada frame con disparo, en el segundo caso haces indefinidas comprobaciones mientras haya colision con algun objeto de tipo disparo.

Lo de usar private y public en vez de local es simplemente para diferenciar el uso de la variable y darle un mejor ámbito.
funcionar funcionan igual en este ejemplo, la diferencia sería más bien teórica.

Crear una variable local afecta a todos los procesos existentes, justo en el momento que creas una variable local creas una variable con ese nombre en todos los procesos, todas independientes entre sí.

En el caso de public y private solo creas una variable en el proceso actual del public, así no sobrecargas los demás procesos.

Diferencia entre public y private. Una variable public la puedes referenciar como hicimos en "id_disparo.daño", es decir desde otros procesos (son las que denominariamos como comunicadoras de información entre procesos)

En cambio las private son variables que solo las puedes usar dentro del proceso en que las declaraste, esto sirve para evitar que otro proceso pueda cambiar su valor. típico de variables auxiliares y contadores internos de procesos.


Lo del orden es debido a que en el segundo proceso creas una variable de tipo el primer proceso, así que hasta ese momento si no existe el proceso no sabría crear la variable de ese tipo, se puede solucionar poniendo "-aC" (si no recuerdo mal, sino mirando los parámetros puedes sacarlo) a la hora de compilar con bgdc.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Windgate

Hola, he leído un poco por encima tu problema, es un topic xD

Echa un vistazo al tema 39 de mi todavía incompleto tutorial, explica muy bien cómo usar PUBLIC y tiene su videojuego de ejemplo asociado.

También haz caso a DCelso, diga lo que diga tendrá razón, es como tu padre :D
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

SplinterGU

si se te complica mucho, no uses public ahora, usa local... luego cuando estes mas avanzado ves el tema de los public...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

gecko

pasa que por la forma en que tengo hechas las cosas necesitaba que de alguna manera se comuniquen un proceso con otro.

Lo probe y funciona perfecto. Lo que no tenia claro era lo de declarar la variable de tipo proceso, dentro del otro proceso.

Muchas gracias de nuevo por la ayuda, y ya mismo voy a buscar ese tutorial a ver si se me aclaran un poco mas esas cosas!

:)
Torres Baldi Studio
http://torresbaldi.com

gecko

sigo con mis dudas, esta es mas curiosidad:

tengo un proceso padre, ese proceso crea a un hijo y desaparece, dejando al hijo "huerfano", hay alguna forma de que ese pobre hijo huerfano sea adoptado por otro padre? o por su "abuelo"?

jeje, quedo muy estilo cuento la pregunta, pero se entiende.
Torres Baldi Studio
http://torresbaldi.com

Windgate

Sí, a la variable father del proceso huérfano puedes asignarle la id de cualquier otro proceso, con eso consigues la adopción.

Si te soy sincero, sé que puede hacerse, pero nunca lo he hecho :P
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

Futu-block

esto de las familias es muy interesante...

Drumpi

Tambien puedes usar:
GET_ID(TYPE miproceso);
Para obtener la ID del proceso huérfano (en este caso llamado miproceso() ) y no depender de FATHER, SON, BIGBRO...

Hay muchas variables que no se deben tocar, y no se si esas son algunas de ellas, supongo que no. Pero si te pones a mirar LOCALS en la ventana de debug verás unas cuantas estructuras, que no están documentadas en ningún lado, para uso interno, pero que están ahi ^^
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

no, no puedes hacer eso, si lo haces romperas internamente todo el sistema de herencias... las variables father, son, bigbro, smallbro, id,... no deben ser tocadas...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Oh, ¿Entonces no se puede asignar otro id de proceso a father? En su día hubo un hilo en el foro en el que se dijo que sí... Como decía, nunca lo he probado, pero vamos, si Splinter dice que no se puede o que puede dar problemas, me lo creo. Sinceramente, en un juego hecho por mí no lo haría ni aunque fuese posible...
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

gecko

a splinter tenemos que creerle, no? jaja

igual me las "ingenie" de otra forma... una vez que el padre crea al hijo, el padre se duerme (en lugar de desaparecer y dejar al hijo huerfano), y recien cuando el hijo desaparece ahi es donde mata al padre con S_KILL_TREE, de esta forma, si el "abuelo" quiere, los mata o congela a todos, y no se me desarma el arbol.
Torres Baldi Studio
http://torresbaldi.com

Rein (K´)ah Al-Ghul

Quote from: SplinterGU on January 31, 2010, 03:51:51 PM
no, no puedes hacer eso, si lo haces romperas internamente todo el sistema de herencias... las variables father, son, bigbro, smallbro, id,... no deben ser tocadas...

Digamos q tengo el proceso A que llama al proceso B
y Tengo el proceso C q llama al proceso D
si cambio el padre de C por el padre de B quedaria y al padre de B lo pongo en null digamos
quedaria
A => C => D

aunq deberia cambair le hijo de A para evitar errores, no???
esto es algo meramente teorico...

se q esto no se debe acer aunque halla posiblidad

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ