Collision desde otro proceso

Started by Arcontus, February 05, 2012, 09:57:51 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

¿Se puede hacer un collision desde otro proceso?

ej: collision(ID_PROCESO_A, ID_PROCESO_B);
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

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

Arcontus

Quote from: SplinterGU on February 05, 2012, 10:03:09 PM
no se puede.

Pero no se puede por que es imposible programarlo, o no se puede "aun".
Aun que no hay diferencia a corto plazo, podría ser muy útil de existir dicha función, ya que como mínimo a mi me limita mucho este detalle.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

no se puede actualmente, tampoco esta en los planes... no es la filosofia del lenguaje hacerlo de esa forma... cada proceso deberia chequear si el mismo colisiona con otro... no entiendo en que te limita.

podrias dar mas detalles?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Si, puedo añadir más detalles:

Imagina que tienes la siguiente estructura:
* proceso enemigo: se encargará únicamente de pintar el proceso en pantalla y seguirá existiendo mientras tenga vida. Este proceso no se encargará de mover el gráfico.
* proceso IA: se encargará de, en función de los parámetros, mover, atacar, acercarse, alejarse..., el proceso enemigo.
* proceso Mapa: se encargará de, en función de los parámetros, cambiar el comportamiento del proceso IA. También el añadir objetos con los que interactuar.

Lo he dividido así para que los procesos "enemigo" no sean taaaaan largos para comprobar tantas variables distintas. Entonces, desde IA, no puedo saber si un proceso colisiona con otro, sino que necesito obligatoriamente definir todas las causas de colision dentro de enemigo, o programar distintos enemigos y según la ocasión llamar a uno u a otro, pero vamos que por la estructura que había pensado, no puedo llebar toda la IA a otro proceso.

Por ejemplo: ¿como puedo mover el proceso enemigo, si desconozco si colisiona contra: otro enemigo, una pared, un objeto,...? Necesariamente, cada enemigo tendrá que tener todo el código de colision en su interior. Y si quiero hacer un enemigo distinto, obligatoriamente tendre que repetir esa porción de código en su interior,...

Es como FGET_DIST( X1, Y1, X2, Y2 ) y GET_DIST(ID), ambas son super útiles.

En fin, si lo piensas no creo que sea tan raro.
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

cada proceso puede hacer la colision sin necesidad de que pongas toda la IA en el proceso enemigo... y ademas puede ser tranquilamente configurable.

el proceso puede tener una variable publica llamada "colisiono_con", y decir ahi con quien colisiona.

la funcion que propones podria ser muy peligrosa, porque podria permitir cosas como "collision( type lala, type pepe )", creando un bucle bastante mostruoso, pudiendo consumir demasiado tiempo en un solo proceso.

no estan en los planes hacer una collision de la forma que propones, y no lo veo absolutamente necesario, pero si aun insistes en que te es necesario, los fuentes de bennugd estan disponibles para que cualquiera lo modifique, y las funciones de collision son bastantes simples de entender, ademas cualquier duda que tengas puedes consultar tranquilamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Lo de "collision( type lala, type pepe )" si es verdad que puede ser muy divertido de procesar, pero ¿acaso cuando tienes N enemigos no compruebas por cada uno si ha colisionado contra un "disparo"?. No digo que no tengas razón, pero tampoco está tan mal.

Sobre: "el proceso puede tener una variable publica llamada "colisiono_con", y decir ahi con quien colisiona."

Si, así resuelves para un "tipo" de proceso, pero tienes que seguir poniendo los "colisiono_con_disparo, colisiono_con_pared, colisiono_con_objeto, colisiono_con_enemigo, colisiono_con_aliado,..." y es código que repetirás si haces nuevos procesos del tipo enemigo.

No es ningún problema trabajar como hasta ahora, pero pensé que a parte mia, a otros les podría ser también útil.

5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

todo es segun como lo miras...

si tienes menos disparos que enemigos, quizas lo mejor sea que disparo chequee colision con enemigo...

por otro lado, tranquilamente puedes tener un array publico de una estructura que indice "typo de proceso", "pid de proceso colision", y en la IA recorrer ese array, asi no tienes por que tener colision_con_pared, colision_con_disparo, etc... a eso me referia yo.

pero siempre depende de como veas el asunto, si para ti los procesos son entidades, entonces la logica local pertenece a la entidad, luego puedes tener una IA general que gobierna el mundo, pero cada entidad puede tener su logica basica.

te repito, todo depende del cristal con que lo mires.

EDIT: Me olvide decir, que no importan los casos generales, las excepciones hacen las reglas... (esto va en referencia a lo que mencionaste sobre cantidad de enemigos y disparos...), si hay una excepcion a algo o si algo tiene una remota posibilidad que pase, no dudes que va a pasar.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Anyeos

Quote from: Arcontus on February 05, 2012, 09:57:51 PM
¿Se puede hacer un collision desde otro proceso?

ej: collision(ID_PROCESO_A, ID_PROCESO_B);

Yo creo que si se te da que ID_PROCESO_A es el mismo que el que verifica la colisión capaz que se te termina colgando el juego (bucle infinito). O si es el mismo que el ID_PROCESO_B.

Mejor que no exista entonces.

Y no se pueden hacer funciones? Y creas una función IA. Así acomodarías mejor tu código sin meter todo en el proceso del enemigo. Aparte podrías llamar esa función desde otros procesos enemigos haciendo que se comporten todos con la misma IA y sin alterar el flujo del juego. Pero la solución que te dieron la veo buena también.

No sé, sólo tiro ideas.

SplinterGU

Quote from: Anyeos on February 08, 2012, 10:01:50 AM
Quote from: Arcontus on February 05, 2012, 09:57:51 PM
¿Se puede hacer un collision desde otro proceso?

ej: collision(ID_PROCESO_A, ID_PROCESO_B);

Yo creo que si se te da que ID_PROCESO_A es el mismo que el que verifica la colisión capaz que se te termina colgando el juego (bucle infinito). O si es el mismo que el ID_PROCESO_B.

esas cosas se podrian controlar, de hecho de controlan ahora mismo con el proceso actual.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

es una pamplina lo que propones, ya que cada proceso al colisionar puede dar valor a una variable, si quieres hasta global, e interpretarla por el proceso que mantiene la IA...

lo que se viene llamando puntero ¿no?

Arcontus

Ya he hablado por privado con SplinterGU y la conclusión es que a pesar de que se pueda hacer, no comparte la filosofia de Bennu por diversos motivos ya expuestos. De todas maneras, tanto como "pamplina lo que propuse" pues no se... :)

Y no, no tiene nada que ver con punteros y a la vez si xD.

Lo vuelvo a explicar con algo más de detalle:

En mi caso particular, no trabajo con un enemigo, sino con listas enlazadas de enemigos. Cada proceso enemigo llama a un proceso IA y le pasa ciertos parametros, como la &x, la &y,... y desde IA que es un proceso hijo de cada proceso enemigo, pues compruebo sus cosillas. Los enemigos no comprueban colisiones, ya que son los disparos los que verifican la colision, por lo tanto, de momento va bien la cosa.

Ahora es donde me surge el "problema": Quería añadir una nueva funcionalidad, al clicar con el mouse sobre un enemigo quiero mostrar sus estadisticas. Para ello, tengo que montar un collision en todos los distintos procesos enemigos con mouse, pero a la vez, en algunos casos no hay que realizar esta comprobación (ej: estamos en otro menú o cualquier otra casuistica). Bien, esto me lleva a tener que picar más codigo en cada proceso enemigo, en vez de tenerlo solo una vez en el proceso IA, y en el caso oportuno haría:
...
fcollision(ID_enemigo, type mouse); //donde ID_enemigo es el PID del proceso enemigo al cual controla esta IA.
...

Lo único que pretendía era ahorrarme código, por mi particular programa, y pensé que otros podrían estar en mi misma circumstancia, pero entiendo que no es la idea de Bennu.

Gracias de todas formas.

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

ahhh, pero me hubieras explicado eso antes...

yo pense que IA era un proceso unico, no que eran hijos de cada proceso enemigo...

eso lo puedes emular simplemente...

ya que IA es hijo de enemigo, y vos queres comprobar enemigo... podes hacer lo siguiente antes de llamar a collision haces lo siguiente...

graph = father.graph
x = father.x
y = father.y
angle ...
flags ...
size ...
size_x ...
size_y ...
(creo que no me olvido ninguna mas)

yo te recomiendo poner father.graph a 0 para evitar el chequeo de colision con el proceso padre (enemigo), y luego restauras cuando terminas de hacer collision...

tambien podrias hacer que enemigo no tenga grafico, sino que el grafico este en IA, pero ahi puedes tener el problema en hacer colisiones por tipo de proceso, ya que tipo te quedaria siempre en IA... aunque no es tampoco problema, puedes acceder a father.reserved.process_type y saber el tipo de proceso.

creo que cualquiera de estas opciones puede servirte para lo que quieres hacer.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Siiiii!!!!, justamente hago todo eso para X, Y,... y me faltaba solo el collision. Ostras tio, que buena solución. Karma++

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Futu-block

OJO, no equivocarse, pamplina es para mi :D