Tutorial de programación de videojuegos con Bennu

Started by Windgate, May 19, 2009, 12:07:33 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

amzg

Windgate, en el primer tema "http://spritedatabase.net" esta ya corregido pero su enlace  te sigue llevando al .com y no al .net como deberia, era solo pora avisarte.

Un saludo

Windgate

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

DCelso

#77
hola windgate,
he probado el tutorial 10, y el ejemplo, no está del todo mal pero no deja ver el resultado del todo bien. Los enemigos salen todos fuera de la pantalla en las 4 esquinas.
Para poder (medio) jugar dentro de las limitaciones de la demo puse esto
rand(50,750) y rand(50,550) así los enemigos salen dentro de la pantalla y podrás mover al sonir para ir a atacarlos.
También le he puesto un retardo al disparao para que no salten millones de disparos al dejar pulsado el espacio. El resultado del ejemplo ya con estos cambios es el siguiente:

PROGRAM videojuego;
INCLUDE "DLL\import.prg";           //Incluye las DLL necesarias para que todo funcione

BEGIN
set_mode(800,600,32,MODE_WINDOW);    //Resolución de pantalla a 800x600 píxel, 32 bits de color y en modo ventana
load_fpg("images/sonic.fpg");        //Carga el fichero para gráficos sonic.fpg de la carpeta images
protagonista();            //Invocamos al proceso protagonista
END                    //Fin del proceso principal del videojuego

PROCESS protagonista() //Declaración del proceso protagonista
BEGIN
graph=10;    //Establece el gráfico 1 del FPG
x=400;    //Establece la posición horizontal en el píxel 400 de la pantalla
y=300;    //Establece la posición vertical en el píxel 300 de la pantalla
LOOP    //A partir de aquí repetiremos siempre las siguiente instrucciones

IF (key(_up)) //Condición: Si pulsamos la tecla direccional arriba
           graph=graph+1;          //Pasamos a mostrar el siguiente gráfico del FPG
y=y-3;    //Avanzamos 3 píxeles hacia arriba
ELSIF (key(_down)) //Alternativa: Si pulsamos la tecla direccional abajo
           graph=graph+1;          //Pasamos a mostrar el siguiente gráfico del FPG
y=y+3;    //Avanzamos 3 píxeles hacia abajo
END        //Fin de la condición

IF (key(_left)) //Condición: Si pulsamos la tecla direccional izquierda
           flags=0;                //Usamos el flag 0 para ponerlo mirando a la izquierda (Normal)
           graph=graph+1;          //Pasamos a mostrar el siguiente gráfico del FPG
x=x-3;    //Avanzamos 3 píxeles hacia la izquierda
ELSIF (key(_right)) //Alternativa: Si pulsamos la tecla direccional derecha
           flags=1;                //Usamos el flag 1 para ponernos mirando hacia la derecha (Espejado)
           graph=graph+1;          //Pasamos a mostrar el siguiente gráfico del FPG
x=x+3;    //Avanzamos 3 píxeles hacia la derecha
END    //Fin de la condición

       IF (graph>25)           //Condición: Si el gráfico pasa del 25 (Último de la animación andar)
           graph=10;               //Ponemos de nuevo el gráfico número 10 (Primero de la animación andar)
       END                     //Fin de la condición

IF ( x < 0 ) //Condición: Si salimos por la izquierda de la pantalla
x=800;    //Nos ponemos a la derecha de la pantalla
ELSIF ( x > 800 )    //Alternativa: Si salimos por la derecha de la pantalla
x=0;    //Nos ponemos a la izquierda de la pantalla
END        //Fin de la condición

IF ( y < 0 ) //Condición: Si salimos por arriba de la pantalla
y=600;    //Nos ponemos abajo de la pantalla
ELSIF ( y > 600 ) //Alternativa: Si salimos por abajo de la pantalla
y=0;      //Nos ponemos arriba de la pantalla
END        //Fin de la condición

IF ( key(_space) )      //Condición: Si se pulsa la tecla _space
disparo ( );            //Invocamos un nuevo proceso disparo
   frame(600);
END                     //Fin de la condición

       IF ( rand(1,10) == 1 )  //Condición: Si tiramos un dado de 10 caras y sale un 1
           enemigo ( );            //Invocamos un nuevo proceso enemigo
       END                     //Fin de la condición

IF (key(_esc))    //Condición: Si se pulsa la tecla _esc
exit(0);    //Salimos del juego
END    //Fin de la condición
FRAME;    //Mostramos el resultado por pantalla
END    //Fin de las instrucciones que se repiten siempre
END    //Fin del proceso protagonista

PROCESS disparo()           //Declaración del proceso disparo
BEGIN
   graph=42;                   //Toma el gráfico 45 del FPG
x=father.x;                 //Se posiciona en la misma x que su padre (El protagonista)
y=father.y;                 //Se posiciona en la misma y que su padre (El protagonista)
   flags=father.flags;         //Toma el mismo flag de orientación que su padre (El protagonista)
LOOP                        //A partir de aquí repetirá siempre las instrucciones
       graph=graph+1;              //Pasamos a mostrar el siguiente gráfico del FPG
       IF (graph>49)               //Condición: Si el gráfico se pasa del 49 (Último de la animación)
           graph=42;                   //Ponemos de nuevo el gráfico 42 (Primero de la animación)
       END                         //Fin de la condición
       IF (flags==0)               //Condición: Si su orientación es normal (Mira hacia la izquierda)
    x=x-8;                      //Decrementa su posición horizontal en 8 píxeles
       ELSIF (flags==1)            //Alternativa: Si su orientación es espejada (Mira hacia la derecha)
           x=x+8;                      //Incrementa su posición horizontal en 8 píxeles
       END                         //Fin de la condición
FRAME;                      //Mostramos el resultado en pantalla
END                         //Fin de las instrucciones que se repiten siempre
END                         //Fin del proceso disparo

PROCESS enemigo()
BEGIN
   graph=50;
   x = rand(50, 750) ;    //Su posición x podrá valer entre 50 y 750
   y = rand(50,550) ;    //Su posición y podrá valer entre 50 y 550
   LOOP
       x = x + rand(-4,4);                                     //Se mueve aleatoriamente en el eje x hasta 4 píxeles
       y = y + rand(-4,4);                                     //Se mueve aleatoriamente en el eje y hasta 4 píxeles
       IF ( ( x<0 ) OR ( x>800 ) OR ( y< 0) OR ( y>800 ) )     //Condición: Si se sale de la pantalla por cualquier lado
           BREAK;                                                  //Lo matamos
       END                                                     //Fin de la condición
       IF ( collision ( type disparo ) )                       //Condición: Si choca contra un proceso disparo
           BREAK;                                                  //Lo matamos
       END                                                     //Fin de la condicón
       FRAME;
   END
END
Monstruos Diabólicos

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

Windgate

Cierto es, al aparecer en las esquinas tienden a salirse fuera... Lo solventé en el tema siguiente haciendo uso de unas variables... Pero lo que propones es una solución perfecta!!!

No caí en la cuenta, lo modificaré en cuanto saque un ratillo, gracias por vuestros aportes, seguro que le facilitan la vida a más de uno :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

Windgate

#79
Hola amigos, estoy subiendo los videojuegos asociados a los temas que faltaban (Iba retrasado en esa parte...) y quiza suba algún tema más y/o rectifique erratas en los que ya hay. Me urge porque empiezo con un cursito para jóvenes el Martes y me gustaría ofrecerles un acceso al site con más completitud, al menos llegar a la parte del scroll...

Tengo un problema con el videojuego del Tema 13, me acabo de dar cuenta de que si pulsas _UP y _LEFT y además _SPACE el protagonista se desplaza hacia arriba a la izquierda en diagonal, pero ya no responde a _SPACE para disparar...

¿Cuántas key( CONST ) pueden interpretarse a la vez? ¿Es problema del teclado, de Bennu o de cómo lo he programado?

Si alguien se ha enfrentado con este problemita y lo ha resuelto satisfactoriamente que me oriente please.

EDIT: Estoy añadiendo los logos en la sección de enlaces, todos van en formato de 200 píxeles de anchura y en formato PNG, por ahora tengo el de TRINIT y el de Bennu... El problema es que me gustaría tener un logo Bennu enlazando al foro y otro enlazando a la web. ¿Alguien tiene algún logo "oficial" en el que ponga Web y Foro respectivamente?

Otra opción sería dejar sólo 1 logo y enlazar a la web, al foro se hace referencia en el texto de presentación previo al tutorial.

EDIT 2: Me he tomado la libertad de poner en alpha el fondo blanco del logo de Bennu, los logos que me paséis con fodno blanco los pondré en alpha para tener un poco de homogeneidad... Espero que no haya problema por eso.
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

josebita

Lo de las teclas, hace tiempo era un problema conocido de los teclados, ahora no lo sé...

SplinterGU

no es ni de bennu, ni de sdl... depende de los teclados...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Sigue siendo un problema conocido de los teclados, eso no ha cambiado.
Yo recomiendo usar z, x, c, v, o bien w, s, a, d como botones de acción en conjunto con los cursores, nunca me ha dado problemas, ni jugando tres personas en el mismo teclado ;D
El problema lo dan las teclas especiales (alt, ctrl, space...) junto con los cursores.
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)

FreeYourMind

Yo he tenido ese problema, exactamente igual :)

Eso viene ya desde Div2, me ocurrio despues en Fenix y tambien en Bennu. Me imagino que sea un problema de los teclados, o algo que se me escapa, ya que revise el código y estaba perfecto, sin errores.

Para el Art Shot el cual se mueve en 8 direcciones y dispara tambien en esas 8 direciones
Exactamente con el mismo código de movimiento (en 3 conversiones/plataformas distintas) tenia los siguientes resultados:

1 - Div2 (probado en otro PC, hace años):

El prota en movimiento, no dispara en una de las diagonales (ahora no recuerdo cual, pero sólo fallaba en una, seria hacia abajo/derecha o hacia arriba/izquierda).

2 - Fenix (probado hace años en el mismo pc de arriba):

Exactamente el mismo problema.

3 - Bennu (PC portatil Y en la Wiz):

En el PC Portail me falla en las dos diagonales, o sea, en movimiento hacia abajo/derecha o hacia arriba/izquierda no dispara.
En la Wiz va perfecto en todas las diagonales, ya que uso el mapeo que tiene tambien para diagonales (y esta versión es sólo para Wiz, así poco me imprta que no funcione bien en el PC).

Tampoco se el verdadero origen, pero mirando la naturaleza de las plataformas que probe (ports del juego) y distintas máquinas, seguramente sea de la configuración del teclado.

FreeYourMind

Gracias. Ya sabemos entonces el verdadero origen. Y Yo pepleandome hace años por eso, hasta que lo deje porque el código no tenia errores...

SplinterGU

el problema se debe no a las pulsaciones en una deteminada posicion, sino en la cantidad de teclas a la vez que se pulsan... tampoco se debe a la configuracion, sino limitaciones del hardware...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

#86
Quote from: SplinterGU on September 12, 2009, 02:46:19 PM
el problema se debe no a las pulsaciones en una deteminada posicion, sino en la cantidad de teclas a la vez que se pulsan... tampoco se debe a la configuracion, sino limitaciones del hardware...

Si el problema se debiera sólo a la cantidad de teclas que se pulsan, entonces tendria que fallar en todas las direcciones  (4 diagonales), porque el numero de teclas pulsadas es exactamente el mismo  ;D ;D ;D

Windgate

#87
Tengo un teclado Logitech USB, no es un buen teclado pero tampoco es el más barato de la tienda...

Es una pena no poder combinar las teclas direccionales con el espacio, es lo más intuitivo para un juego sencillo.

Gracias por aclararlo! ;D

EDIT: En cuanto al tutorial he subido videojuegos hasta el tema 15 y unas sencillísimas instrucciones para ejecutarlos en Windows y Linux, sigo con los videojuegos del tema 16 y siguientes... La verdad se trata de añadir 10 líneas de código contadas en cada uno, pero da perecita porque es demasiado fácil... :P

Por supuesto el código con un comentario con línea, ahí no se debería perder nadie.

Todos los juegos llevan las DLL necesarias para quienes no tienen instalado Bennu, espero que si me he dajado alguna DLL (Yo creo que no...) me avise. También he modificado algunos temas explicando mejor alguna cosa.
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

el numero a la vez y la combinacion... claro esta... y no todos los teclados se comportan igual...

pero puede ser alguna condicion en la logica, que se te esta pasando por alto... no hay que descartar nada...

como comentario adicional (para los casos que aplique) en los casos donde se pulsan muchas teclas a la vez hay que evitar usar ascii, hay que usar key...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Sí sí, uso key por descontado, y las condiciones son lógicamente correctas, de hecho lo que me ignora es _SPACE y está dentro de un IF que no depende de nada, simplemente se evalúa después de _LEFT y _UP, si cambio el orden y compruebo primero _SPACE sigue ocurriendo exactamente lo mismo.

Será entonces problema del teclado...
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