Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: gecko on January 29, 2010, 06:15:22 PM

Title: Procesos y variables
Post by: gecko on January 29, 2010, 06:15:22 PM
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!...
Title: Re: Procesos y variables
Post by: DCelso on January 29, 2010, 06:43:08 PM
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

Title: Re: Procesos y variables
Post by: gecko on January 30, 2010, 12:11:42 AM
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!
Title: Re: Procesos y variables
Post by: DCelso on January 30, 2010, 12:30:40 AM
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.
Title: Re: Procesos y variables
Post by: Windgate on January 30, 2010, 03:48:07 AM
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
Title: Re: Procesos y variables
Post by: SplinterGU on January 30, 2010, 10:22:14 PM
si se te complica mucho, no uses public ahora, usa local... luego cuando estes mas avanzado ves el tema de los public...
Title: Re: Procesos y variables
Post by: gecko on January 31, 2010, 02:31:17 AM
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!

:)
Title: Re: Procesos y variables
Post by: gecko on January 31, 2010, 04:52:56 AM
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.
Title: Re: Procesos y variables
Post by: Windgate on January 31, 2010, 05:52:23 AM
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
Title: Re: Procesos y variables
Post by: Futu-block on January 31, 2010, 09:12:00 AM
esto de las familias es muy interesante...
Title: Re: Procesos y variables
Post by: Drumpi on January 31, 2010, 02:10:16 PM
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 ^^
Title: Re: Procesos y variables
Post by: 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...
Title: Re: Procesos y variables
Post by: Windgate on February 01, 2010, 08:49:21 PM
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...
Title: Re: Procesos y variables
Post by: gecko on February 01, 2010, 08:59:55 PM
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.
Title: Re: Procesos y variables
Post by: Rein (K´)ah Al-Ghul on February 01, 2010, 09:07:41 PM
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
Title: Re: Procesos y variables
Post by: grisendo on February 01, 2010, 10:26:53 PM
Yo entiendo que no tiene sentido hacer un cambio de padre así. Lo que dice Splinter es cierto, en la práctica puedes cambiar el padre de un proceso P con P.father, pero estás haciendo que el hijo sepa quién es su padre... pero no que el padre sepa que P es su hijo!! Entonces, luego ese padre no reconoce a P como hijo al usar funciones tipo _tree, ni P va a saber quienes son sus hermanos a no ser que modifiques muchas más variables (método muy guarro, y ni aún así no sé si es factible...)

Yo lo que haría sería una variable pública/local de "huerfano" a 0. Cuando un proceso padre muere, en el ONEXIT que ponga a todos sus hijos la variable "huerfano" a 1. Y como dice drumpi usar get_id():

[code language="bennu"]
process padre
begin
   ...
   // crear hijos
   ...
onexit
   // para i = todos los hijos, i.huerfano = 1;
end

process hijo
public
   huerfano = 0;
begin
   // Su codigo
end

process buscarhuerfanos
private
   aux;
begin
   while(aux=get_id(type hijo))
       if(aux.huerfano)
           // lo que sea con ellos
       end
   end
end
[/code]
Title: Re: Procesos y variables
Post by: Windgate on February 02, 2010, 12:19:09 AM
Gran idea lo del ONEXIT y el proceso de adopción xD

Desde luego si en un enrevesado videojuego me veo con la necesidad de hacer algo así tomaré tu idea Grisendo, voy cocinando el karma para entonces :D
Title: Re: Procesos y variables
Post by: SplinterGU on February 02, 2010, 01:43:48 AM
si cambian esos datos, despues no vengan que se les cae bennu... muchas de esas variables son puntas de listas... y tambien internamente hay hashes que si tocan estas variables los arruinan...
Title: Re: Procesos y variables
Post by: Windgate on February 02, 2010, 06:47:52 AM
Tranquilo, si lo hacemos y suceden cosas excéntricas no le echaremos la culpa a Bennu :D
Title: Re: Procesos y variables
Post by: SplinterGU on February 02, 2010, 03:07:42 PM
la cosa es que despues surjen cazas de bugs fantasmas en operaciones que nada tienen que ver, y es una perdida de tiempo para uds. y para mi...
Title: Re: Procesos y variables
Post by: grisendo on February 02, 2010, 03:29:41 PM
Pero con el ejemplo que he puesto no estoy tocando nada chungo, no? Porque esas cosas de cambiar los father y tal las hacía de crío (no exactamente esa, pero barbaridades parecidas) cuando jugueteaba con DIV y no tenía ni idea de qué era un puntero xDD y salí escaldao con la de fallos que me salían... Nunca más!!

Por cierto, no se pueden hacer que esas variables sean de "sólo lectura" y que el compilador no permita asignarlas? Evidentemente se puede hacer, lo que me refiero es que si tal y como está planteado el compilador, supondría mucho problema modificar cosas... Lo dejo como sugerencia de todas formas.
Title: Re: Procesos y variables
Post by: SplinterGU on February 02, 2010, 06:11:21 PM
actualmente no se pueden hacer de solo lectura.
Title: Re: Procesos y variables
Post by: Windgate on February 03, 2010, 12:11:40 AM
Je je je, las respuestas de Splinter son como un sable afilado, en 4 palabras y en 2 segundos responde dudas que a tí te han costado 3 párrafos y varios años de conjeturas ;)
Title: Re: Procesos y variables
Post by: SplinterGU on February 03, 2010, 02:09:21 AM
:P
Title: Re: Procesos y variables
Post by: grisendo on February 03, 2010, 09:48:08 AM
Ya te digo... el estereotipo que nos intenta vender la televisión del argentino que habla por los codos... estoy viendo que eso es falso xD
Es como los dibujantes de viñetas buenos, que con una o dos palabras hacen chistes mejores que otros con párrafos
Title: Re: Procesos y variables
Post by: DCelso on February 03, 2010, 09:55:15 AM
pues yo me creo el estereotipo, conozco a unos cuantos en persona y no hay manera de callarlos, fijo que splinter en persona tb habla por los codos :D.
Title: Re: Procesos y variables
Post by: SplinterGU on February 03, 2010, 03:03:17 PM
soy timido... mas bien me gusta escuchar que hablar... se aprende mas... cuando hablo es porque estoy muy seguro de algo, y dijo lo justo y necesario... no me gusta hablar por demas... (a pesar de mi cantidad de posts...)

tambien me gusta señalar las cosas que se hacen mal, o incluso me gusta preguntar a alguien que definio o diseño algo cosas sobre el mismo como si no entendiera, pero solo para hacerle ver a esa persona que se le esta escapando algo que no penso... y que tiene ahi una falla...

PD: Creo que esta vez hable por los codos... :P