Hace unos días estuve viendo el video de spore. En él Will Wright muestra algunos detalles técnicos del juego, así como una gran parte de su contenido jugable. Básicamente el juego trata de evolucionar con tus criaturas desde que eres un microorganismo hasta invadir otros planetas de galaxias lejanas. En el juego destaca la capacidad de creación de criaturas en base a partes del organismo que el juego te ofrece y a partir de ellas, proceduralmente, se generan las animaciones y demás. Es bastante impactante ver en el video como genera diferentes criaturas añadiendo patas a su columna vertebral, o picos y ojos a su cabeza (o cabezón). Además, como dice en el video, los escenarios están generados proceduralmente, esto es, no están previamente creados por un artista y almacenados en disco. El artista lo diseña y se guarda la información que permite generarlo posteriormente, no los datos ya generados. Esto permite un ahorro bestial de disco.
Me llamó poderosamente la atención el hecho de que las animaciones se generaran al vuelo, supuse que habrá algún tipo de directrices que permitan generarlas, de otra forma es imposible, aunque con lo que he visto de video no soy capaz de concluir nada. Me puse a buscar información al respecto y he encontrado un link del 1994 sorprendente.
Karl sims propone un algortimo genético en el cual a partir de unas funciones muy básicas (sumas, multiplicaciones…) y un grafo neuronal genera criaturas en base a cubos usando una física “muy básica”. Las crituras que crea tienen 3 propósitos, andar, salar y nadar. Lo que sorprende, sobretodo en las criaturas que nadan, es como la evolución hace que se parezcan a las criaturas que tenemos e la naturaleza. Si te interesa el tema no dejes de leer los dos papers: “Evolving Virtual Creatures” y “Evolving 3D Morphology and Behavior by Competition”. Explica sin demasiados tecnicismos como están creadas las criaturas y las puedes ver en movimiento bajándote el video de archive.org

La mayoría de aplicaciones que se basan en licencias utilizan algún sistema para fijar una licencia a un determinado dispositivo, de tal forma que esa licencia solo se puede usar para cierto dispositivo y no otros. Es lógico pensar que una de las opciones es usar el identificador único que la mayoría de máquinas tienen para fijar esta relación.
Hace no demasiado me he comprado un PocketPC que trae windows mobile 5 y una de las cosas que me hn llamado la atención es que al ejecutar algunas aplicaciones el sistema operativo me avisaba de que no estaba firmada y podría dañar mi equipo. Ya estamos acostumbrados a ver estos mensajes cuando instalamos un driver en windowsxp que no está firmado por alguna autoridad y por tanto he estado pasando de él.
En estos días estoy testeando la aplicación para asistencia al guiado para el agricultor en diferentes equipos y me han dejado un pocketpc con windows mobile 5 con un GPS con un refersco de 5Hz. Al arrancar la aplicación veo que la rutina que toma el identificador del dispositivo falla. Voy a internet y tras unos minutos encuentro lo siguiente: resulta que por cuestiones de seguridad microsoft ha optado por deshabilitar las llamadas al sistema que permitían obtener el identificador del dispositivo salvo para códigos “trusted”, esto es, de una fuente conocida. Para ser una fuente conocida tu aplicación debe tener un certificado que permite leer ese identificador y claro, para obtener esa certificación tienes que abonar la correspondiente suma.
Menos mal que han habilitado una función para recoger el ID, GetDeviceUniqueID, y cuyas cabaceras y librerías vienen en el SDK de windows mobile 5, que por otro lado no te puedes bajar si no posees una copia legal de windows. Como son 170 y pico megas y yo vengo de una saga de aventureros usuarios de modem de 56k decidí que pasaba de bajarme toda esa purrela para usar una simple función. Recordé mi época en la que todo era maravilloso y todo lo quería hacer modular dividiendo las aplicaciones en tropecientas DLL’s que, por cierto, casi nunca llegaban a ninguna parte, y me puse manos a la obra…. un poco de LoadLibrary, un poco de punteros a funciones y voila:
typedef HRESULT (*idfunc)(LPBYTE,DWORD,DWORD,LPBYTE,DWORD*);
inline BOOL GetDevideIDWindowsCE5(unsigned int *id)
{
idfunc GetDeviceUniqueID;
HINSTANCE h = LoadLibrary(_T(“coredll.dll”));
if(h)
{
GetDeviceUniqueID=(idfunc)GetProcAddress(h, _T(“GetDeviceUniqueID”));
if(GetDeviceUniqueID)
{
HRESULT hr = NOERROR;
BYTE rgDeviceId[DEVICE_ID_LENGTH];
DWORD cbDeviceId = sizeof(rgDeviceId);
#ifndef GETDEVICEUNIQUEID_V1
#define GETDEVICEUNIQUEID_V1 1
#endif
hr = GetDeviceUniqueID(reinterpret_cast(APPLICATION_DATA),
APPLICATION_DATA_LENGTH,
GETDEVICEUNIQUEID_V1,
rgDeviceId,
&cbDeviceId);
if(hr != NOERROR)
{
return FALSE;
}
BYTE* p =(BYTE*) rgDeviceId;
unsigned int k = 0;
for(int i=0; i< cbDeviceId; ++i)
{
k += *p;
}
*id = k;
return TRUE;
}
return FALSE;
}
return FALSE;
}
Visitando el blog de Jare he encontrado dos links batasnte interesantes.
Uno de ellos es a una galería con imágenes generadas proceduralmente. Lo interesante no son solo las imágenes, además el autor deja el código fuente de los applets que generan esas imágenes, que por cierto usan una librería/lenguaje llamado processing. Dos ejemplo: creación de una ciudad y node garden. No os perdais el código fuente que puedes ver en la misma página que el applet.
El segundo link es a una entrevista a Kenta Cho en la que habla de sus juegos, da algunos detalles de la programación, su inspiración y otras cosas. Merece ser leída.
Bien, estoy terminando el proyecto fin de carrera y como muchos sabéis es una aplicación que ayuda al agricultor en labores en las que el apero es de un gran ancho de trabajo y por ello no puede calcular las distancias a ojo.
Estoy en la parte del estudio de costes y aprovechando una hand-shake de correos con rafael mompó en el que discutíamos sobre el estado de las telecomunicaciones, en concreto de los empleos, en España y Europa a la luz de la reciente noticia del déficit de empleados, le he enviado un mail con un presupuesto chorra basado en la más cruda realidad:
”””
Calculo que he tardado unos 3 meses en hacer la aplicación (a tiempo completo tomando cafés y eso) y tengo que estudiar los costes de mano de obra. Como puedo trabajar en casa pongo el coste 0 de oficinas, unos 50€/mes el PC (1), no les cobro internet porque con mis conocimientos de redes he conseguido crackear la contraseña WEP al vecino, 60€ de la copia de windows home y luego 400€/mes que es lo que valgo según las empresas del sector (2) (bueno, no incluyo los tickets de comida 5€/día). Además debo incluir los impuestos que en este caso, al ponerme como supuesto autónomo serían unos 200€/mes (3)(el 50% de mi sueldo) e imagino que me quedo en el tintero alguna cosa más. Total, si vendo 1 unidad de la aplicación del proyecto ya ha salido rentable y todavía gano dinero…
”””
(1) Un PC dura dos años, a 1200€ sale 50€/mes
(2) Datos reales
(3) Sin ningún tipo de prima
Ahora en serio. Siguiendo las inidcaciones de rafa, cobrando 3 millones al año, con unos gastos de SS de 10000 euros, más un 20% de la cantidad anterior de gastos extras y teniendo en cuenta que solo trabajas 112 días al año, finalmente sale un precio hora de unos 40€.
Lo triste es que esos 3 millones no los gano ni por el forro, porque teóricamente debería vender unas 36 unidades al año a unos 1500€, cosa bastante imposible :).
Hoy en linuxjuegos han hecho referencia a una noticia que envié hace unos días acerca de pyweek.
Además de eso también comentan la posibilidad que les plantee de promover a través de linuxjuegos la participación en las compos de stratos. Ellos han escrito algunos tutoriales (1,2 )de creación de juegos con pygame que pueden resultar de utilidad a la hora de crear un juego, pero sobretodo atraer e impulsar a gente a crear pequeños juegos.
A ver si sale algo :)