23 de diciembre de 2010

Upgrade Retina Display GLBasic (8.174 -> 8.200)

Una interesantísima actualización sobretodo para aquellos que desarrollamos para dispositivos iOS; Gernot ha añadido a GLBasic soporte para Retina Display, lo que permitirá realizar aplicaciones universales y aprovechar la pantalla como toca.

A probarlo ya!

La nueva versión incluye también un nuevo comando sencillo para tratamiento de cadenas de texto: REVINSTR.

(fichero log_e.gbas)
// New command:
// REVINSTR() - reverse find in a string.
//
// Editor:
// Undo/Redo groups are set properly now.
//
// iPhone:
// Retina display supported. Must set Project options
// resolution and check with GETSCREENSIZE if it's
// a high res device.
//
// [ Resolution Matrix ]
// XCode GLBasic iPod iPhone iPad
// iPhone+iPad,320x480 320x480 320x480 768x1024
// iPhone+iPad,640x960 320x480 640x960 768x1024
// iPhone ,320x480 320x480 320x480 320x480
// iPhone ,640x960 320x480 640x960 320x480
//
// Legend:
// XCode: Settings in the XCode project
// GLBasic: Project options in GLBasic IDE
// iPod: iOS 3.x or iPhone 2G, 3G, 3G[S]
// iPhone: iOS4.2+ and Retina display device
// (iPhone 4, iPod 4th gen)
// iPad: iPad with iOS <= 4.2 (so far)

16 de diciembre de 2010

Litiopixel para iPad

Bien, de momento creo que ya he realizado las pruebas que quería; comprobar rendimiento y funciones en el iPad con GLBasic.


Voy a rediseñar algunas rutinas internas de pintado del mapa y de control touch, para que la aplicación pueda ser universal (iPod/iPhone y iPad compatible).

Esto retrasará el proyecto un poquito más; a posteriori recuperaré el tiempo invertido en la adaptación ya que con el mismo código fuente podré generar las versiones para las diferentes resoluciones de pantalla.

11 de diciembre de 2010

Diseño de tipografía LCD Matrix

Inspirándome en los displays electrónicos, he decidido crear una tipografía de estilo Dot Matrix con el programa Graphics Gale.



Para que el resultado final sea satisfactorio, he tenido que retocar los espacios laterales para el kerning así como los "huecos blancos" para que los carácteres no se junten unos con otros.


El resultado no está nada mal, además me encaja en pixeles perfectamente con el fondo de la aplicación, que es lo que más me interesaba.

10 de diciembre de 2010

Multitarea en iOS 4.2.1 iPad

Es imprescindible que la aplicación funcione en multitarea, las últimas versiones del sistema operativo iOS ya soportan esta funcionalidad. GLBasic "incluye" algunas funciones que sirven para este propósito.


- Autopause (true/false).

- Allowscape (true/false).

Aunque los nombres ya indican bastante, su explicación es muy sencilla. Autopause permite que la aplicación se ponga en pausa cuando pierde el foco (se pincha en otra ventana ó en el caso del iPad, se pulsa el botón home y sale de la aplicación).

Allowscape hay que activarlo como false, lo que no permite cerrar la aplicación y la deja a disposición de ser pausada.

Para gestionar los eventos de pérdida y recuperación de foco tenemos las siguientes subfunciones predefinidas: GLB_ON_QUIT cuando la aplicación pasa a estar pausada y GLB_ON_RESUME para tomar el control cuando vuelve a GLB.

Funcionamiento perfecto y sin problemas. ;-)

9 de diciembre de 2010

Test actualización BlogPress

Hace un tiempo adquirí la aplicación BlogPress para blogging en dispositivos con iOS. En principio parece que sirve para mis propósitos, aunque no me acaba de convencer cómo gestiona el asunto de subir fotos al blog... y sobretodo la forma que emplea para enlazar las mismas.


Subiendo imagen de prueba... Veremos si luego no me tocará editar el HTML del post.

...

Nota: Pues sí, he tenido que retocar manualmente el código web desde el iPad. :-(

2 de diciembre de 2010

Actualizando GLBasic (8.148 -> 8.174)

Mientras espero la actualización que permitirá "tocar" algunos de los "objetos" que pertenecen al GUI de iOS, se presenta esta versión que incluye los siguientes cambios:

(fichero log_e.gbas)
// 8.174
// Core:
// Variable font spacing-space character is small as 'j'
//
// iOS:
// - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
// -> url will be what you get with GETCOMMANDLINE$()
//
// Compiler:
// Coexistance with MinGW is possible now.
//
// Editor:
// Ctrl+C works in the output window.

15 de noviembre de 2010

Video HD: Rotación pantalla iPad OK

Por fin, tras solventar los "pequeños problemas" con la declaración de funciones de OpenGL, puedo presentar este simple test de rotación de pantalla en iPad.

10 de noviembre de 2010

Compilado de rutina rotación iPad *** 1 FAILED ***

Adjunto el error que muestra GLBasic cuando intento compilar el test de rotacion en iPad/iPhone. Aparentemente parece un problema en la declaracion de OpenGL, aunque en Win32 el programa funciona perfecto.

 _______________________________________
*** Configuration: IPHONE ***
precompiling:
GPC - GLBasic Precompiler V.8.110 SN:5e0cd1c3 - 3D, NET
Wordcount: 231 commands
compiling:
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glGetClipPlane(DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:733: error: no matching function for call to 'DIMDATA(__GLBASIC__::DGIntArray&, int, __GLBASIC__::GLdouble [4])'
/cygdrive/Q/Compiler/platform/Include/glb.h:803: note: candidates are: void __GLBASIC__::DIMDATA(__GLBASIC__::DGIntArray&, int, DGInt*)
/cygdrive/Q/Compiler/platform/Include/glb.h:805: note:  void __GLBASIC__::DIMDATA(__GLBASIC__::DGNatArray&, int, DGNat*)
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glLoadMatrixd(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:1741: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glLoadMatrixd(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glMultMatrixd(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:1796: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glMultMatrixd(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2691: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2771: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glVertex4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:2851: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glVertex2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glNormal3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3091: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glNormal3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glIndexdv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3347: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glIndexdv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glColor3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:3955: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glColor3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord1dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4723: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord1dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4803: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4883: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexCoord4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:4963: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glTexCoord4dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5427: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos2dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos3dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5507: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos3dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRasterPos4dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5587: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRasterPos4dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glRectdv(__GLBASIC__::DGIntArray&, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:5795: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glRectdv(const __GLBASIC__::GLdouble*, const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glTexGendv(DGInt, DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:6889: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '3' to 'void glTexGendv(__GLBASIC__::GLenum, __GLBASIC__::GLenum, const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glGetTexGendv(DGInt, DGInt, __GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:6955: error: cannot convert 'DGInt*' to '__GLBASIC__::GLdouble*' for argument '3' to 'void glGetTexGendv(__GLBASIC__::GLenum, __GLBASIC__::GLenum, __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glEvalCoord1dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:7369: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glEvalCoord1dv(const __GLBASIC__::GLdouble*)'
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp: In function 'DGInt __GLBASIC__::glEvalCoord2dv(__GLBASIC__::DGIntArray&)':
/cygdrive/C/DOCUME~1/ADMINI~1/CONFIG~1/Temp/glbasic/gpc_temp1.cpp:7481: error: cannot convert 'DGInt*' to 'const __GLBASIC__::GLdouble*' for argument '1' to 'void glEvalCoord2dv(const __GLBASIC__::GLdouble*)'

*** FATAL ERROR - Please post this output in the forum
_______________________________________
*** Finished ***
Elapsed: 5.3 sec. Time: 23:01
Build: 0 succeeded.
*** 1 FAILED ***

El enlace que he abierto en el foro para comentar el problema.

Video HD: Test rotación pantalla OpenGL para iPad

Sencillo vídeo en el que se pone a prueba la rotación de pantalla a 180º.

Mi código/muestra es una modificación de la fuente publicada por millerszone (KidNovak) en este hilo del foro GLB.

9 de noviembre de 2010

Fix-It, manifiesto de reparación...

Conocido sobreotodo por gente que utiliza equipos Apple, Fix-It es un referente en lo que a auto-reparaciones de ordenadores y hardware se refiere...

Esta mañana he recibido un correo en el que esta gente notifican el inicio de una nueva campaña en la que la intención es poner de manifiesto la importancia de las reparaciones de hardware... para ello promueven imprimir el póster que se puede encontrar aquí y enviarles una foto donde se muestre dónde se ha expuesto.


En el póster se pueden leer puntos como: "reparar es mejor que reciclar", "reparar salva el planeta", "reparar ahorra dinero" y "reparando aprendes ingeniería", entre otras.

Curiosa iniciativa, cuanto menos.

ACTUALIZADO: Kyle de Fix-It, me envía el enlace de la traducción del poster a otros idiomas.

2 de noviembre de 2010

Pruebas de rendimiento en iPad

Leo en el foro de GLBasic bastantes comentarios acerca del rendimiento de GLBasic en iPad, sobretodo cuando aplicamos un fondo o se trabaja en exceso con el comando DRAWSPRITE entre otros que afectan al buffer de pantalla.

En este hilo se comentan diversas opciones para mejorar el comando CLEARSCREEN y así optimizar el rendimiento del juego.



En mis pruebas el resultado del render SIN aplicar aún el nuevo comando es de unos 19-20 FPS dibujando en bucle lo siguiente:

1- Fondo de pantalla completo (1024x768x133) con un fichero PNG de 256 colores.

2- Un tablero de 15x15 tiles de 32x32 pixels, PNG de 256 colores.

3- Tres bloques de 240x240 pixels, PNG de 256 colores.

4- El tile correspondiente al dado de 60x60 pixels, PNG de 256 colores.

5- Los textos del bloque del dado, también PNG de 256 colores.

6- Las líneas de texto "debug" en blanco.


Para mi entender no está nada mal, aunque sería preferible los 45-60 FPS que se pueden conseguir en un iPhone. Seguiré haciendo pruebas, sobre todo ahora que hay la nueva actualización del lenguaje.

1 de noviembre de 2010

Actuación GLBasic "especial" iPad 8.148

Aparece como "regalo" para Halloween una nueva actualización bastante importante de GLBasic.

En esta ocasión el update modifica un comando, entre otros, dedicado al modo de trabajo del doble buffer de pantalla.

Se trata de CLEARSCREEN, que ahora incluye una nueva opción aún no documentada en el Help. La sintaxis CLEARSCREEN -1 permite mantener el fondo de pantalla como estaba, sin borrarlo con ningún color. Esto permite que nuestro juego pueda funcionar más rápido aún, combinando con LOADBMP y SHOWSCREEN la presentación en pantalla de fondos.

Hay que destacar también otro comando que también añade un parámetro muy bueno; se trata de PRINT, que ahora permite kerning de texto (la separación entre letras).

Definitivamente un upgrade imprescindible. A probarlo!

(fichero log_e.gbas)
// 8.148
// Compiler:
//    Later declared TYPEs cause no more warning.
//    Member functions returning a type work now.
//    LOCAL a[] AS double // works now -> the array was dropped before.
//    BREAK/CONTINUE work inside REPEAT...UNTIL.
//
// Core:
//    Better error messages with GETLASTERROR$ in:
//       LOAD... and OPENFILE
//
//    CLEARSCREEN -1 -> does not clear the backbuffer
//    on SHOWSCREEN. (Faster if you take care of that).
//
//    SHOWSCREEN: Z-Buffer only gets cleared if X_MAKED was used.
//
// iPhone:
//    using GL_EXT_BGRA on iOS 3.x and higher -> slightly faster
//    LOADSPRITE, SAVESPRITE, GRABSPPRITE and USEASBMP.
//
// Pandora:
//    using OpenGL|ES now. Run! Run!
//
// Commands:
//    PRINT supports font kerning with an additional parameter.
//    SPLITSTR can keep empty tokens now.
//
// Editor:
//    Functions within types are coloured keywords now.
//    Replace in selection yields some feedback what it did.
//    iPhone XCode directory will no longer overwrite project
//    and plist files.

Nota: Muchos de estos avances han sido gracias a la inestimable ayuda y colaboración desinteresada de los participantes de Foro de GLB. Seguid así.

18 de octubre de 2010

Optimizando el movimiento

Debido al accidente de mi madre me encuentro en ocasiones fuera de casa, lugar donde tengo todos los datos y apuntes referentes al proyecto. Aprovecho los pocos momentos que dispongo para retocar pequeños detalles del código.


La captura muestra el mapa y la representación en pantalla de algunas de las variables que controlan el movimiento del personaje principal.

Actualmente estoy optimizando los cálculos de desplazamiento del mapa para que precisen menos variables y sea más compatible por velocidad/estabilidad con todas las máquinas con iOS disponibles.

10 de octubre de 2010

GLBasic actualizado a la versión 8.125

"Mini" actualización de GLBasic, aparentemente es un parche sobre las funciones afectadas.

(fichero log_e.gbas)
// 8.125
// Core:
// Framebuffer was defect. SAVESPRITE/SAVEASBMP/CREATESCREEN didn't work.

5 de octubre de 2010

Pausa obligatoria...

Temas de familia, obligaciones, ya se sabe... en ocasiones uno tiene que aparcar sus cosas y dedicarse por entero a otros menesteres... ésta vez, me toca.


Espero estar de vuelta ya mismo, quizás en menos de un mes...

Actualizando GLBasic (8.085 -> 8.120)

Los muchachos del Dream Design Team han vuelto a actualizar el software; para esta nueva versión tenemos las novedades son las siguientes:

(fichero log_e.gbas)
// 8.120
// Editor:
// Functions in TYPES are marked as such in the jump list view.
// New command:
// URLENCODE$() and URLDECODE$() - format data of a HTTP request
// Compiler:
// GLOBAL variables, initialized on start can use functions now. GLBasic
// engine is initialized beforehand. ( GLOBAL a=func() )
// PLATFORMINFO("BATTERY") fixed on Windows, WinCE and iPhone
// iPhone:
// Sound engine memory leak is fixed.
// Core:
// memory leak in SAVESPRITE/SAVEBMP fixed.

30 de septiembre de 2010

Test de tiles en iPad - 001

Fotografías del juego ejecutándose en el iPad. Aplicación compilada en modo iPhone, por eso se muestra tan grande (2X).



El juego de tiles empleado aún no es definitivo. Tengo en la mesa de operaciones los gráficos con más detalle y sombras ya añadidas, como muestro en el post anterior...

Y continúa la edición de tiles...

Tras el disgusto por el accidente de mi madre... por fin la han operado y parece que con resultado positivo; así que voy aprovechando los rincones de tiempo de que dispongo para seguir editando los tiles que corresponden a los mapas...


Estoy sometiendo a los tiles a contínuas modificaciones "sutiles"... hasta conseguir un look que me agrade.

22 de septiembre de 2010

Tiles, tiles, tiles...

Llevo nosecuantos días ya retocando imágenes. La intención es diseñar un entorno ya medio amigable en el que poner a prueba los objetos.


El diseño de los mapas tiene bastante trabajo, he descartado unas cuantas opciones; las capturas pertenecen a las pruebas en su séptimo intento de conseguir algo decente.


Con la ayuda de Photoshop he obtenido los valores para las sombras de los muros y objetos que luego he aplicado manualmente tile a tile.


Inicialmente en el proyecto, pensé añadir las sombras en una capa suelta (un tileset diferente cargable con LOADANIM desde GLBasic), pero tras diferentes pruebas he decidido aplicarlas directamente sobre los gráficos.

17 de septiembre de 2010

Retocando los mapas... y más.

Retocar pixels, añadir las sombras, homogeneizar los diferentes tiles que componen el nivel, probar las puertas tanto en vertical como en horizontal... mucho trabajo "en la trastienda" por hacer.




He modificado también la rutina interna de renderizado de la pantalla del juego, ahora precisa de menos cálculos y dibuja el mapa "por capas" (fondo, objetos, sombras y personajes).

Todo preparado para la próxima inclusión de los bot enemigos.

Diseñando la pantalla de objetos

La distribución de la pantalla de objetos permitirá mostrar un icono representativo, la descripción del ítem, así como opciones para desprenderse del objeto ó usarlo.

16 de septiembre de 2010

Actualización GLBasic 8.085

Después de unos días de infarto, retomo el proyecto con la esperanza de darle el empujón que necesita. He encontrado una nueva actualización del entorno así que la he descargado e instalado...

Las novedades:

(fichero log_e.gbas)
// 8.085
// iPhone:
// GRABSPRITE in landscape mode works - it's slow, mind.
// multitasking on iOS4 works?
// New Command:
// PLATFORMINFO$("TEMP") returns a directory where you can write temp files.

14 de septiembre de 2010

Adiós Fiat Punto

Así quedó el coche de mamá este fin de semana.

Afortunadamente están vivos y parece que será el susto más que otra cosa... :-)


3 de septiembre de 2010

Sombra del protagonista añadida

Pequeña actualización del juego. He añadido un pequeño gráfico a modo de sombra debajo del personaje principal.

Empleo la función ALPHAMODE para hacer que el objeto se dibuje transparente (sólo lo pinta a un 20% de su opacidad normal).

31 de agosto de 2010

Regreso al "pixel"

Se acabaron las "vacaciones".

Como a Michael J. Fox en la película Regreso al Futuro, el tiempo empieza a correr en mi contra; NECESITO publicar el programa YA. Llevo ya bastante tiempo trabajando en él y creo que tengo que avanzarlo todo lo que pueda en el menor tiempo posible.


Como soy muy perfeccionista en todo lo que hago (o eso creo), el proyecto se está alargando bastante retocando y puliendo detalles internos del juego... así que de esta tarde no pasa para que termine las rutinas internas del mapa...

Aún me quedará la parte de diseñar los diferentes niveles, enemigos.... bufff, casi nada.

24 de agosto de 2010

Actualizando a GLBasic versión 8.078

Aunque ya hacía tiempo que se trabajaba en la versión 8 y todas sus betas (ver en el foro oficial los múltiples comentarios al respecto), ahora el entorno se despega de la coletilla de beta para ser la actual versión oficial descargable, la número 8.078.

Éstas son las diferencias que se han introducido desde la 7.341 hasta la version actual que como se puede ver no son pocas:

(fichero log_e.gbas)
// 8.078
// iPhone:
// iOS4 multitasking able. See "AUTOPAUSE" manual.

// Core:
// INSTR and REPLACE$ can work with binary data
// containing CHR$(0) characters now.


// 8.064 beta
// Editor:
// Code-folding uppercased INLINE code.
// Font-Creator:
// Added font dialog scaling, better font sizing and
// taking care of 128/256 character fonts now.
// Compiler:
// can reuse same function name in multiple TYPEs.
// nested ?IF didn't evaluate well.


// 8.054 beta
// Mac/iPhone:
// NETWEBGET hung for good.
//
// Compiler:
// external TYPEs should work now.


// 8.050 beta
// iPhone:
// SAVESPRITE/SAVEASBMP fixed to work on iPhone. (do all platforms work?)
// PLATFORMINFO$("BATTERY") was broken.
//
// New Platform:
// Pandora - http://www.openpandora.de
// WinCE - Works also with Windows CE Netbooks


// 8.03 beta
// New command:
// MEM2SPRITE, SPRITE2MEM - Sprites from DIM pixel data.
//
// Editor:
// Option to change inline background colour.
//
// iPhone:
// Total of 16 simultanously touches can be handled now (for iPad mainly)


// 8.006 beta
// Compiler:
// Bugs with functions in types fixed.
// Win32:
// Window was not centered with multiple monitors.
// Editor:
// Update was still refering to V7
// iPhone:
// IMPORT "C" int iPhoneIsCracked() // works now
// Landscape mode was broken.


// 8.002 beta
// Compiler:
// Auto-generated variables are GLOBAL in main program, and LOCAL for SUBs and FKTs.
// Option "Explicit declarations" is enabled for new projects by default.
// Comments broke the precompiler commands.
// Help comments (//?) choked the compiler.
//
// Core:
// Network: switched to blocking sockets internally. Faster on most platforms.
// BMP images with 16 bit colour depth are supported now. (Where'd you get these from?)
// New protection system allows external GPC calling.
//
// iPhone:
// MOUSEAXIS was defect.
// iPad support added. Use the project options to set the screen size.
//
// New command:
// NOT - negates an expression.
// ENCRYPT$() - encrypt a string (128 bit encryption)
// DECRYPT$()
// LEFT$() - convenient MID$() wrappers
// RIGHT$()


// 7.350
// *** ANNOUNCEMENT ***
// THIS IS THE LAST V7 UPDATE. YOU WILL NEED A NEW SETUP
// TO V8.x NOW! GET IT. NO UPDATE FEE REQUIRED.
// FULLY COMPATIBLE.

// Editor:
// IncrediBuild skips improved.

Sistema de puertas terminado

He terminado la rutina de implementación de puertas en el mapa. He diseñado varios tipos de puertas en función de cómo se pueden abrir éstas.

De momento hay definidas tres puertas; las que se abren sin más, las que requieren una llave (objeto que hay que recoger) y las que para abrirse requieren que se active un botón.


En la primera captura podemos ver un recuadro en verde con el texto "RES 00"; eso es el "botón" que abre la puerta... requiere que algún objeto ó personaje se sitúe en dicha posición permanentemente para que la puerta se mantenga abierta.


Ya de paso comento la pequeña evolución que ha sufrido el fichero de gráficos del mapa... aunque no es definitivo, el set de tiles del mapa incluye ahora otros tonos de color (grises)... y sombras para darle un toque más curioso.

17 de agosto de 2010

Extraño error de pintado de sprites

He detectado un problema en el pintado de sprites. Se trata de un "error" que sólo sucede en el iPhone 3G 16Gb, en el caso del iPad 32Gb no hay problema.

El procedimiento que empleo para el pintado de sprites es el siguiente:

En primer lugar cargo la imagen utilizando LOADSPRITE. La imagen tiene un tamaño de 1280x480(x256) píxeles, formato PNG. La idea es utilizar esta única imagen para las diferentes pantallas del tutorial, separados en 4 "páginas" (1280/4=320 píxeles).


Para la representación de las diferentes páginas hago lo siguiente: primero pinto la imagen en la posición pantalla 0,0 que será la "primera página". Espero pulsación en pantalla y modifico el valor de la posición horizontal de la imagen y pinto la misma imagen en -320,0 para mostrar la "segunda página"... así sucesivamente hasta completar las 4 "páginas".


Bueno, sólo hay que ver la captura para observar el fallo que se presenta SOLO en el iPhone (la imagen aparece como DOBLE de tamaño horizontal). iPad y otras plataformas como Win32 ... funciona a la perfección.


Esperemos a ver los chicos del foro de GLBasic, a ver qué opinan.

16 de agosto de 2010

Video GLBasic - Test LPNT-IX 007 HD

Vídeo del estado actual del desarrollo donde se muestran los avances en cuanto a los objetos insertados en el mapa.

15 de agosto de 2010

NetHack, el origen de todo.

A estas alturas del desarrollo y aún no he comentado la idea de donde parte el proyecto LitioPixel; se trata del clásico Nethack (recomiendo la lectura del enlace en la Wikipedia).

Si aún no lo has probado éste es el momento ya que es un juego que aunque por su aspecto puede parecer muy simple, esconde en su interior todo un mundo de magia y misterios.




Capturas extraídas de la página oficial http://www.nethack.org/) con el juego en módo gráfico original, ASCII. También podemos observar el aspecto que muestra para las versiones de windows en módo gráfico.

Citando al la Wikipedia, disponible para Unix (en sus múltiples variantes, incluidos Linux, Solaris, Cygwin y muchas otras más), MS-DOS, Windows, MacOS, PalmOS, Windows CE para Pocket PC, Amiga...y actualmente añado que también hay versión para todas las plataformas actuales y cómo no iPod / iPhone / iPad.

Objetos en el mapa

Montaje de varias capturas en las que se muestran los avances en cuanto al mapa y objetos con los que interactuar.


Como se puede ver en la imagen, de momento he declarado cuatro tipos de objetos:

- OBJ 01 y OBJ 02, recogibles. Cada uno gestiona una variable diferente.

- OBJ 03 no permite ser recogido. Pensado para ítems "decorado".

- OBJ 04 permite ser empujado. Funcionará a modo de "trigger".

Incluyo también muestra de información del mapa conforme se carga. Tengo pensado modificar esta pantalla para que muestre información al jugador sobre el nivel, tiempo, objetivos, etc.

La miniatura situada abajo a la derecha muestra cómo los OBJ 04 han sido movidos, así como el resto de objetos que ya han sido recogidos, lo cual se refleja en el panel marcador del juego.

13 de agosto de 2010

Trabajando en la sombra...

Vacaciones!?!?

Trabajo cada día un mínimo de cuatro horitas en el desarrollo del juego... quiero aprovechar las horas que tengo libres para avanzar.

El editor de mapas funciona correctamente (ver post anterior), aunque el interface de usuario es muy tosco; no pienso mejorarlo, me sirve para lo que necesito y puedo añadir funcionalidades al mapa a través del editor sin demasiadas complicaciones.


Sigo trabajando en mejorar el método de carga del mapa (la estructura interna del fichero ha cambiado) ahora ya tengo los objetos cargados en el mapa y el personaje principal los detecta y recoge sin problemas. Tengo por optimizar aún la rutina de empujar los objetos.

He aprovechado también para limpiar los gráficos y su asignación en memoria, he reducido de 21 a 15 los png que necesito cargar, aunque ahora son todos de tipo ANIM. Incluídas las 4 variaciones de tipografías que pienso utilizar.

Como comentario final, mi contador de ejecuciones del juego SOLO en el portátil Windows indica 662 test... ;)

8 de agosto de 2010

Editor de mapas básico terminado

De momento mi sencillo editor está terminado. He modificado el formato del fichero de mapas para poder incluir todas las características que necesito. Ahora el archivo ocupa el triple en tamaño ya que además de almacenar las posiciones de los gráficos en el mapa, incluye algunas nuevas características que necesito por nivel como objetos, acciones, etc.


El editor de mapas incluye las siguientes características:
- Tamaño de mapa modificable.
- Tres capas de trabajo: gráficos, objetos y "acciones".
- Posición de entrada/salida de mapa posicionable.
- Posibilidad de dar nombre al mapa.
- Reacción independiente por "tile" según "acciones".

*Nota: La velocidad de la aplicación que se muestra en el vídeo no corresponde con la realidad debido al consumo de recursos que emplea el software de captura empleado.

5 de agosto de 2010

Fin del mantenimiento...

Demasiados días ya sin programar ni avanzar en el proyecto... de momento dejo el blog como está actualmente en cuanto a diseño, colores y "gadgets"...

3 de agosto de 2010

Mantenimiento del blog...

Ya se sabe, cada X tiempo toca realizar mantenimiento del blog, eliminar fotos de Picasa que me sobran, modificar alguna que otra cosa por aquí y por allá, añadir las opciones de compartir a Facebook y Twitter, en fin... algo aburrido, pero necesario.


Aprovecho también para cambiar los colores del blog, me apetece ver que tal quedará con unos tonos más "retro".

31 de julio de 2010

Editando los mapas del juego...

Estoy desarrollando una sencilla utilidad para poder diseñar mis propios mapas. Tras probar algunas aplicaciones como TileStudio, me encuentro que los mapas no son 100% aplicables a mi juego.


He diseñado una estructura de mapa que contiene varias "capas". En cada capa almaceno el valor de los gráficos, el status de la posición (si es atravesable, bloqueado, oculto, etc..) entre algunas otras cosas.


También necesito definir la posición de entrada en el mapa, así como la salida, enemigos, etc...

26 de julio de 2010

Thrusmater Dual Trigger 3 in 1 Rumble Force

Para poder realizar los test en el ordenador sobre el sensor acelerómetro comentado en el post anterior, necesito un Joystick para PC/Mac (con puerto USB compatible); aunque he realizado algunos test de virtualización éstos no han dado el fruto esperado así que no me ha tocado más remedio que recurrir a hardware real.


En la foto, el Joystick tipo Gamepad (ó similar en diseño a los mandos de consola de sobremesa actuales) que me ha dejado mi hermano Ricco.

Prueba simple del sensor acelerómetro

Leyendo en el manual de GLBasic encontramos información de cómo implementar rutinas que "controlan" el comportamiento del sensor acelerómetro del iPhone.


Copio y pego el texto original del manual: "The acceleration sensor of the iPhone can be polled with GETJOYX(0), GETJOYY(0) and GETJOYZ(0) accordingly. The return values are the accelerations for each axis in "G" (9.81 m/s^2)."

Lo que viene a decir en pocas palabras que GETJOY eje (joystick) nos permite saber sobre que eje estamos rotando el teléfono.


La pantalla es una muestra de implementación; es una sencilla prueba que estoy realizando.

19 de julio de 2010

Imagen de carga "Splash" personalizable...

En GLBasic podemos personalizar la pantalla de carga "Splash" en las versiones para iPhone / iPad / iPod. Desconozco si para otras plataformas también funciona este "truco" (basta con incluir con Xcode una imagen Default.png en las Resources del proyecto y recompilar).




La muestra reproduce tres fotogramas de la carga de imágenes... disponibles en el Foro Oficial.

NOTA: Debido a la velocidad de carga del propio GLB, la pantalla sólo se muestra en pantalla apenas un segundo y medio, cuando en el iphone 3G la podemos observar durante casi 3 segundos...