30 de marzo de 2010

Video GLBasic - ProyectoLP WIP 001

Segundo test sencillo de aplicacion desarrollada con GLBasic y compilada con XCode.



Tambien se muestra con ifile que el programa graba un fichero de configuracion. Accesible en la carpeta /Documentos, dentro de la App.

Resumen de modificaciones (1)

Sin entrar en detalles técnicos, el proyecto ha sufrido algunas leves modificaciones internas para adaptar mejor el funcionamiento del motor interno y control principal. He creado nuevas variables que gestionan aspectos como el tiempo de repintado de gráficos y control del ratón. También he ajustado el control de botones para una mejor detección de pulsaciones, gestión de deshabilitados, etc.

En rasgos generales, éstos son los cambios que ha sufrido el código:

- Renombrada y modificada la Funcion DibujaFPS a ControlFPS. Ahora no sólo dibuja los FPS actuales, sinó que además controla los milisegundos trancurridos con la nueva variable ControlTick_Sec. (Necesario para un mejor control de la función Render).

- Nueva variable matriz 2D Mapa [Ancho] [Alto], para almacenamiento de valores sencillos del mapa de trabajo. (A sustituir en un futuro por una estructura completa).

- Definición de las variables mínimas necesarias para pintar el personaje principal. Almacenan la posición en matriz del mapa, así como gráfico para su representación. (A sustituir en un futuro por una estructura completa).

- Limpieza del código, así como depurado del mismo.

25 de marzo de 2010

Botones y el control del ratón

He terminado la estructura del ratón junto con el control de funcionamiento de los botones. Los botones han sido modificados gráficamente para incluír dos estados; normal y botón pulsado. (El color magenta de las intersecciones es para la transparencia RGB (255,0,255).



En este gráfico están dibujados 4 botones y 2 estados. Los botones corresponden al menú principal y permiten acceder a juego, opciones, info y volver. En la zona superior están los botones en estado normal y debajo se dibujan los mismos botones pero un poco modificados, para que se aprecie que se están pulsando (en este caso simplemente modifico el color del borde a rojo).

Propiedades de un botón:

- Boton_Menu_A.PosicionX <- Posición X px en pantalla.
- Boton_Menu_A.PosicionY <- Posición Y px en pantalla.
- Boton_Menu_A.Ancho <- Ancho en px del botón.
- Boton_Menu_A.Alto <- Alto en px del botón.
- Boton_Menu_A.Grafico <- Código del gráfico dentro de "anim".
- Boton_Menu_A.Activado <- 0 No activado / 1 activado.
- Boton_Menu_A.Encima <- 0 No se pulsa / 1 Mantiene pulsación.
- Boton_Menu_A.Pulsado <- 0 n/a / 1 Botón seleccionado.

La variable que controlará los estados corresponde a boton.Encima, que controlamos en el bucle del fichero raton.gbas.

Para el funcionamiento del bucle incluyo un organigrama en el que muestro los diferentes controles que realizo para cada botón. Los botones opciones e info también tienen el mismo bucle aunque no se representa por falta de espacio.



Finalmente el código sin optimizar (sólo emplea IF/THEN):

 FUNCTION ControlRaton: Local_ModoMaquina  
   
   MOUSESTATE mx, my, b1, b2  
   
   IF b1=TRUE  
     Estado_Raton=1  
     Pos_Raton_X=mx  
     Pos_Raton_Y=my  
   ENDIF  
   
   IF b1=FALSE  
     IF Boton_Menu_A.Encima=1  
       ModoMaquina=1 //JUEGO  
     ENDIF  
   
     IF Boton_Menu_B.Encima=1  
       ModoMaquina=2 //OPCIONES  
     ENDIF  
   
     IF Boton_Menu_C.Encima=1  
       ModoMaquina=3 //INFO  
     ENDIF  
   
     IF Boton_Menu_D.Encima=1  
       ModoMaquina=0 //MENU  
     ENDIF  
   
     Boton_Menu_A.Encima=0  
     Boton_Menu_B.Encima=0  
     Boton_Menu_C.Encima=0  
     Boton_Menu_D.Encima=0  
     Estado_Raton=0  
     RETURN  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=0  
     Boton_Menu_A.Encima=0  
     Boton_Menu_B.Encima=0  
     Boton_Menu_C.Encima=0  
   
     IF Boton_Menu_A.Activado=1 AND Pos_Raton_X >= Boton_Menu_A.PosicionX AND Pos_Raton_X <= Boton_Menu_A.PosicionX + Boton_Menu_A.Ancho AND Pos_Raton_Y >= Boton_Menu_A.PosicionY AND Pos_Raton_Y <= Boton_Menu_A.PosicionY + Boton_Menu_A.Alto  
       Boton_Menu_A.Encima=1  
     ENDIF  
   
     IF Boton_Menu_B.Activado=1 AND Pos_Raton_X >= Boton_Menu_B.PosicionX AND Pos_Raton_X <= Boton_Menu_B.PosicionX + Boton_Menu_B.Ancho AND Pos_Raton_Y >= Boton_Menu_B.PosicionY AND Pos_Raton_Y <= Boton_Menu_B.PosicionY + Boton_Menu_B.Alto  
       Boton_Menu_B.Encima=1  
     ENDIF  
   
     IF Boton_Menu_C.Activado=1 AND Pos_Raton_X >= Boton_Menu_C.PosicionX AND Pos_Raton_X <= Boton_Menu_C.PosicionX + Boton_Menu_C.Ancho AND Pos_Raton_Y >= Boton_Menu_C.PosicionY AND Pos_Raton_Y <= Boton_Menu_C.PosicionY + Boton_Menu_C.Alto  
       Boton_Menu_C.Encima=1  
     ENDIF  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=2  
     Boton_Menu_D.Encima=0  
   
     IF Boton_Menu_D.Activado=1 AND Pos_Raton_X >= Boton_Menu_D.PosicionX AND Pos_Raton_X <= Boton_Menu_D.PosicionX + Boton_Menu_D.Ancho AND Pos_Raton_Y >= Boton_Menu_D.PosicionY AND Pos_Raton_Y <= Boton_Menu_D.PosicionY + Boton_Menu_D.Alto  
       Boton_Menu_D.Encima=1  
     ENDIF  
   ENDIF  
   
   IF Estado_Raton=1 AND Local_ModoMaquina=3  
     Boton_Menu_D.Encima=0  
   
     IF Boton_Menu_D.Activado=1 AND Pos_Raton_X >= Boton_Menu_D.PosicionX AND Pos_Raton_X <= Boton_Menu_D.PosicionX + Boton_Menu_D.Ancho AND Pos_Raton_Y >= Boton_Menu_D.PosicionY AND Pos_Raton_Y <= Boton_Menu_D.PosicionY + Boton_Menu_D.Alto  
       Boton_Menu_D.Encima=1  
     ENDIF  
   ENDIF  
   
 ENDFUNCTION  

Codificación rústica, pero eficaz... ya habrá tiempo para depurar y optimizar el programa.

24 de marzo de 2010

GLBasic actualizado 7.285 -> 7.301

Nueva actualización hasta la versión 7.301; incorpora los siguientes cambios:

(fichero log_e.gbas)
// 7.301
// Core:
// SORTARRAY is slightly faster.
// LOADFONT "", id now clears the font for GENFONT() properly.
// INIOPEN "" does not display an error message in the console output.
//
// GP2X/Wiz/WinCE:
// 3D was defect when using colours in the X_OBJADDVERTEX

23 de marzo de 2010

Bocetos pruebas "UFO" en papel

Tras 14 días sin postear, ya va siendo hora de retomar el blog. La pausa ha sido debida a unos test sobre un juego que no tiene nada que ver con la idea que estoy desarrollando en este blog. Y como no tengo material nuevo sobre el proyecto, publico los bocetos realizados sobre papel.













Se trata de unas muestras sencillas de personajes y objetos utilizables en un juego cuyo gameplay no puedo desvelar (de momento). Veremos si acabo empleándolas en un futuro o si quedan simplemente como prueba de diseño...

9 de marzo de 2010

Noid actualizado a su versión 1.2

Noid, juego desarrollado por Tip Tap Games cuenta con un diseño sencillo pero bien realizado. Ha sido publicado en su versión 1.2 añadiéndole soporte a OpenFeint.





Programado con elegancia, Noid nos envuelve en un entorno de ambiente ancestral y nos invita a una partida del clásico juego de la pelota que rebota y rompe ladrillos. Incluye diferentes power-ups que nos permiten tomar ciertas ventajas en la partida, como capturar la pelota, acelerarla ó hacerla rompemuros entre otros...

Enlace de la tienda: http://itunes.apple.com/app/noid/id334690880?mt=8

7 de marzo de 2010

Nuevo juego: What is the cheese?

Del equipo desarrollador del entorno GLBasic, nos llega ahora un nuevo juego ya disponible en la Appstore de Apple. Se trata de What is the cheese?, cuyo gameplay desconozco...



Al parecer este juego ha sido inscrito en la Ludumdare 48H bajo la categoría de Exploración. Por la captura de pantalla yo diría que el juego consiste en señalar dónde se esconde el queso entre una variedad de alimentos comunes en cualquiera de nuestras neveras.



Por si estoy equivocado en la mecánica del juego, nada mejor como el propio enlace al producto en el mismo iTunes. Espero que para futuros lanzamientos tenga la ocasión de probar una versión Lite para no tener que sentirme obligado a comprar a ciegas.

itms://itunes.apple.com/us/app/dr-shiver/id359372225?mt=8

Actualizo el post con enlace al vídeo en Youtube:

La estructura "Boton"

Finalmente he decidido que el control será únicamente con el ratón, prescindiendo del teclado/botones. He creado una nueva estructura llamada Boton que contiene todas las variables y acciones que necesito para posicionar y controlar cada uno de ellos. Esta estructura está definida en el fichero main.gbas justo al inicio de todo el código, antes de dar valor a las variables globales.

 TYPE Boton  
   PosicionX  
   PosicionY  
   Ancho  
   Alto  
   Activado  
   Encima  
   Pulsado  
 ENDTYPE  

Cada variable se describe con el nombre de la misma, aún así paso brevemente a comentarlas. PosicionX y PosicionY almacenan la posición en pantalla del botón. Las variables Ancho y Alto contienen el tamaño que ocupa el botón en pantalla, lo que me permite saber si el ratón está dentro de la zona de pintado. Activado es 0 ó 1 dependiendo de si el botón está disponible para ser pulsado o no. Cuando el ratón está dentro de la zona del botón el valor de Encima se cambiará a 1, en caso contrario permanece siempre en 0. Finalmente Pulsado aloja como valor 1 cuando el botón se mantiene pulsado, momento en el cual el gráfico del botón está modificado para que el usuario se percate de su activación.

 GLOBAL Boton_Menu_A AS Boton  
 GLOBAL Boton_Menu_B AS Boton  

Posteriormente en el mismo fichero main.gbas, declaro dos nuevas variables que almacenarán los valores correspondientes a los dos primeros botones del menú principal de la aplicación. Una vez que ya tenemos los botones, dentro de Variables.gbas incluyo las líneas correspondientes a los datos de cada botón.

   Estado_Raton=0  
   Boton_Menu_A.PosicionX=2  
   Boton_Menu_A.PosicionY=42  
   Boton_Menu_A.Ancho=100  
   Boton_Menu_A.Alto=32  
   Boton_Menu_A.Activado=1  
   Boton_Menu_A.Encima=0  
   Boton_Menu_A.Pulsado=0  

   Boton_Menu_B.PosicionX=2  
   Boton_Menu_B.PosicionY=42+32  
   Boton_Menu_B.Ancho=100  
   Boton_Menu_B.Alto=32  
   Boton_Menu_B.Activado=1  
   Boton_Menu_B.Encima=0  
   Boton_Menu_B.Pulsado=0  

Nótese la varible global no comentada aún Estado_Raton, que se encarga de decirle a la aplicación en todo momento si se ha pulsado el ratón. Inicialmente, dado que aún no se ha pulsado ningún botón del ratón ésta vale 0. Cuando el usuario realiza un click el estado de la variable pasa a ser 1, entonces se ejecutan las rutinas de detectar en qué posición se ha pulsado el ratón y si algún botón de la pantalla se ve afectado.

 FUNCTION ControlRaton: Local_ModoMaquina  
   MOUSESTATE mx, my, b1, b2  
   IF b1=TRUE  
     Estado_Raton=1  
     Pos_Raton_X=mx  
     Pos_Raton_Y=my  
   ENDIF  
   IF b1=FALSE  
     IF Boton_Menu_A.Encima=1  
       ModoMaquina=1  
     ENDIF  
     IF Boton_Menu_B.Encima=1  
       ModoMaquina=2  
     ENDIF  
     Estado_Raton=0  
   ENDIF  
   IF Estado_Raton=1 AND Local_ModoMaquina=0  
     Boton_Menu_A.Encima=0  
     Boton_Menu_B.Encima=0  
     IF Pos_Raton_X >= Boton_Menu_A.PosicionX AND Pos_Raton_X <= Boton_Menu_A.PosicionX + Boton_Menu_A.Ancho AND Pos_Raton_Y >= Boton_Menu_A.PosicionY AND Pos_Raton_Y <= Boton_Menu_A.PosicionY + Boton_Menu_A.Alto  
       Boton_Menu_A.Encima=1  
     ENDIF   
     IF Pos_Raton_X >= Boton_Menu_B.PosicionX AND Pos_Raton_X <= Boton_Menu_B.PosicionX + Boton_Menu_B.Ancho AND Pos_Raton_Y >= Boton_Menu_B.PosicionY AND Pos_Raton_Y <= Boton_Menu_B.PosicionY + Boton_Menu_B.Alto  
       Boton_Menu_B.Encima=1  
     ENDIF   
   ENDIF  
 ENDFUNCTION  

El código fuente de la rutina de control de ratón pulsado, que aunque rudimentaria en su desarrollo resulta totalmente efectiva.

Aunque no lo he comentado y como es lógico, no puede haber una rutina de control de botones sinó tenemos ningún botón en pantalla. En la captura siguiente se pueden observar los gráficos correspondientes a los botones, cuyo diseño y empleo quiero dejar para un artículo futuro.



En la imagen se puede ver en la esquina superior derecha un 1, que corresponde al valor de la variable Estado_Raton como ya he comentado anteriormente. El gráfico correspondiente al botón OPCION A ha sido modificado aprovechando el valor de la variable Boton_Menu_A.Pulsado y Boton_Menu_A.Encima cuyos valores son 1.

4 de marzo de 2010

Organigrama simple del esqueleto...

Por si en mi anterior post "montando el esqueleto del juego" no quedó clara la estructura del programa, añado a tal información una muestra del organigrama de lo programado hasta el momento, que en realidad no es nada más que el entorno simple del programa.



El gráfico (realizado con la excelente y muy recomendale herramienta Dia para diseño de organigramas de todo tipo) muestra con detalle el contenido de cada bloque del programa así como el código GLBasic que emplea en cada sección.

A este esqueleto simple le voy a ir insertando las funciones necesarias para controlar el teclado, ratón, etc. como ya comentaba en el artículo anterior; así podré hacer crecer la complejidad de la aplicación de una forma ordenada.

Cada sección del juego está escrita en un fichero independiente, lo que me en un futuro me permitirá modificar las funciones y alojarlas en diferentes ficheros que se añadirán al proyecto en función de su operatividad.

3 de marzo de 2010

GLBasic actualizado 7.250 -> 7.285

Tras unos días de pausa, hoy he descargado e instalado una pequeña actualización del entorno. Se trata ya de la versión 7.285 que incoropora los siguientes cambios :

(fichero log_e.gbas)
// 7.285
// iPhone:
//    main function runs in a thread. Better compatibilty with other libraries?
// 3D:
//    X_LOADOBJ "", id did not free the memory, nor did GENX_OBJ find this slot later.
// Core:
//    SOCK_SHUTDOWN with no SOCK_INIT lead to strange problems.
//    PRINT refused characters > chr$(127)
// DDgui:
//    New look. Text boxes work much better now. READONLY for all widgets.



Y nada más, habrá que seguir trabajando con el desarrollo del proyecto...