Comportamientos 2D por herencia

Started by Windgate, March 07, 2009, 07:47:05 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Imagino que muchos de vosotros ya lo habéis pensado, pero actualmente estoy trabajando en un módulo PRG con procesos que se invocan desde un proceso "padre" y se dedican a manipular sus variables predefinidas (x,y,graph,size,flags,angle...).

Puede haber un proceso viento que empuje en una dirección, un proceso crecer, un proceso levitar... Las posibilidades son infinitas, y estos procesos de comportamiento serían útiles para cualquier tipo de proceso gráfico: Protagonistas, enemigos, items...

La idea es sencilla, por si a alguno no le queda del todo claro pongo el código de un proceso Parpadear(); encargado de hacer que su padre parpadee, manipulando sus flags, por ejemplo para cuando es golpeado y quieres hacerlo "invencible":
[code language="bennu"]PROCESS parpadear(int cantidad)
//Ofrece parpadeo a cada frame al proceso padre tantas veces como indique
//cantidad multiplicado por 2
BEGIN
    LOOP
        IF (cantidad<0) BREAK; END
        father.flags+=4;
        FRAME;
        father.flags-=4;
        FRAME;
        cantidad--;
    END
END[/code]

Así de sencillo. Estos procesos de comportamiento pueden complicarse hasta los límites de nuestra imaginación: Un vaiven, un tiro parabólico... Cualquier cooperación con este tipo de procesos será bien recibida, por muy simple que sea seguro que resulta útil.

Simplemente prescindid de GLOBAL, que todo llegue a través de parámetros. Espero que les guste la idea  ;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

Danielo515

Desde luego es buena idea. Mantiene el código de los procesos no muy grande, más legible desde el punto de vista humano y evita la duplicidad de código.

Buena idea.Se podría crear una librería de este tipo, así los que empiecen con bennu lo tendrán aún más fácil!!

Windgate

A mí me parece una idea grande para empezar a programar.

Por ejemplo, tengo uno de estos comportamientos por herencia que responde a las teclas direccionales (Incluídas diagonales) para mover a un personaje en todas las direcciones al estilo RPG. El mapa de durezas y el RGB de las mismas se le pasa como parámetro... Son comportamientos muy muy útiles y reutilizables.

En mi último videojuego recién he comenzado con el módulo de comportamientos, por ahora sólo tiene el parpadeo que he mencionado anteriormente, pero incluso la gravedad podría meterse en el mismo sitio. (Descargar el videojuego y ver comportamientos.PRG en la carpeta TAD):

[/b]

Seguro que alguien más puede colaborar en esto, se trata de procesos que usan exclusivamente el father. Por experiencia digo que al principio cuesta familiarizarse con este tipo de programación, pero ahora que ya he programado bastante me parece un recurso grandioso, para los disparos, para los enemigos, para todo!!!

Aquí dejo el comportamiento de gravedad, cuyos parámetros son la velocidad vertical del proceso padre, el mapa de durezas al que responde y los RGB de suelo y techo, basado en el aporte de Prg!
[code language="bennu"]PROCESS gravedad(int POINTER velocidad_gravedad,int mapa,RGB_suelo,RGB_techo);
//Proceso encargado de gestionar la gravedad de un proceso
PRIVATE
    vgravedad; // Variable para guardar temporalmente la gravedad
BEGIN
    // Coge la coordenada y a partir de la gravedad del protagonista (padre)
    vgravedad=(*velocidad_gravedad+=2); // Pero incrementada en 2
    IF (vgravedad>16) // Si es mayor de 16
        *velocidad_gravedad=16; // Haz que sea 16 la gravedad del protagonista
        vgravedad=16; // Y tambi‚n la variable temporal
    End
    IF (vgravedad<0) // Si la gravedad es negativa
        WHILE (vgravedad++!=0) // Mientras no sea cero, la incrementa
        // Si no se da con el techo
            IF (map_get_pixel(fpgs[ESCENARIOS],mapa,father.x,(father.y-24-graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))<>RGB_techo)
                father.y--; // Haz que el protagonista suba
            ELSE // Si no pon la gravedad a cero
                *velocidad_gravedad=0;
                BREAK;
            END
        END
    ELSE// Si la gravedad es cero o positiva
        father.y+=vgravedad; // Se suma a la coordenada del protagonista
        // Comprueba el rango vertical del movimiento del protagonista
        FROM vgravedad=-16 TO 7 STEP 2; // Acaba el proceso si se toca el suelo
            IF (map_get_pixel(fpgs[ESCENARIOS],mapa,father.x,(father.y+vgravedad+graphic_info(father.file,father.graph,G_HEIGHT)*father.size/200))==RGB_suelo)
                BREAK; // Sal si se encuentra con el suelo
            END
        END
        IF (vgravedad<8) // Si se encuentra con el suelo
            father.y+=vgravedad; // Se actualiza con el m ximo que se pueda mover
            *velocidad_gravedad=0; // Y se pone la gravedad a 0
        END
    END
END[/code]

Como he comentado en otro post, este proceso gravedad responde a durezas de suelo para cualquier graph y para cualquier size que pueda tomar el proceso padre. El cálculo está probado hasta la saciedad y es lo más perfecto en gravedad que he visto hasta la fecha. Vello por dentro...  ;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

fulgorelizz

gracias por el aporte, lo estaba buscando xD, creo que esta version del codigo esta mejorada, es mas general, trabajas con el alto dependiendo la imagen que uses del proceso padre que llama a la gravedad, el codigo original viene de doctor malvado de divgames studios!! estaba buscando este codigo xD, hasta el momento ciertamente es el mas preciso, pero hay una conducta que agregare al codigo que seria interesante, ciertamente cuando saltas pegas en el techo podrias rebotar hacia abajo como lo hace este codigo, pero hay casos o juegos como los de maui mallard donde el personaje se queda suspendido en el aire hasta que su fuerza de salto no puede contrarrestar a la gravedad y entonces cae!! :)  creo que este proceso en bennu deberia dejarse ya como un standard para los que inican en programacion xD a mi me falta un chorro en cuanto a  la fisica aplicada  alos juegos, y el chipmunk te ayuda muchisimo xD pero el inventar y romperte el coco mientras programas es lo que le da saborcito al oficio ;) saludos 8)
Compiling code -- generating exe...

peterpollito

este post es de hace mas de dos años pero mola jejeje

La momia que fuma

Viene siendo lo que hice yo en los enemigos del Sitwell, tenía varios procesos de movimiento (en zig-zag, me asomo y me vuelvo, en diagonal, en "u" etc, lo tipico de los matamarcianos) y segun lo que quisiese sacar llamaba a los enemigos asignandoles uno de esos procesos para que lo moviesen en lugar de programar el movimiento en el propio proceso del enemigo.


Arcontus

Existe alguna manera para ¿dado un proceso huerfano, la adopción de este? Supongo y puedo entender que no exista tal función, aun que sería útil para este y otros propositos.

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

SplinterGU

Quote from: Arcontus on May 16, 2012, 05:51:27 PM
Existe alguna manera para ¿dado un proceso huerfano, la adopción de este? Supongo y puedo entender que no exista tal función, aun que sería útil para este y otros propositos.

Saludos!


ese comportamiento lo introduje en una version de fenix, pero luego lo retire porque era un error... daba muchos problemas conceptuales ademas de que era menos performante.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Quote from: SplinterGU on May 16, 2012, 06:21:59 PM
Quote from: Arcontus on May 16, 2012, 05:51:27 PM
Existe alguna manera para ¿dado un proceso huerfano, la adopción de este? Supongo y puedo entender que no exista tal función, aun que sería útil para este y otros propositos.

Saludos!


ese comportamiento lo introduje en una version de fenix, pero luego lo retire porque era un error... daba muchos problemas conceptuales ademas de que era menos performante.
Me ha venido una idea a la cabeza:
¿No sería posible hacer que se pudiera adoptar procesos huérfanos a voluntad?

Es sólo una idea un tanto loca y no sé si podría llegar a ser útil...

SplinterGU

eso es peligroso, porque supon que tienes 3 tipos de proceso, con la siguiente jerarquia...

A->B->C

padre->hijo->nieto

los 3 de diferentes tipos con sus publicas diferentes...

si desde A accedes a locales de B y luego al morir B, adoptarias C, no estarias enterado de que tu hijo yo no es del tipo B sino que es del tipo C, generarias un crash o un comportamiento erratico que no sabrias a que se debe...

este comportamiento se quito porque daba pie a que este tipo de errores sucedan con frecuencia... demas esta decir que nunca te enterarias cuando tu hijo deja de existir si usas "exists(son)", por ejemplo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Quote from: SplinterGU on May 17, 2012, 02:01:51 PM
eso es peligroso, porque supon que tienes 3 tipos de proceso, con la siguiente jerarquia...

A->B->C

padre->hijo->nieto

los 3 de diferentes tipos con sus publicas diferentes...

si desde A accedes a locales de B y luego al morir B, adoptarias C, no estarias enterado de que tu hijo yo no es del tipo B sino que es del tipo C, generarias un crash o un comportamiento erratico que no sabrias a que se debe...

este comportamiento se quito porque daba pie a que este tipo de errores sucedan con frecuencia... demas esta decir que nunca te enterarias cuando tu hijo deja de existir si usas "exists(son)", por ejemplo.

Me refiero a adoptarlo a voluntad, algo como:

if(! exists(pid.father))
    adopt(pid);
end

Pero ya digo que es una idea que tengo en la cabeza pero no sé si puede llegar a ser útil, quizás no...

SplinterGU

quizas para eso te convenga hacer una jerarquia de herencias secundaria a la del sistema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

josebita

Quote from: SplinterGU on May 17, 2012, 02:58:20 PM
quizas para eso te convenga hacer una jerarquia de herencias secundaria a la del sistema.
Sí, quizás sí...