lunes, 11 de abril de 2011

Santiago de Compostela

Anoche llegué tarde a casa tras pasar tres días —sin contar el jueves, que llegamos por la noche al destino— en Santiago de Compostela. Sin desmerecer los viajes más largos, pero que por experiencia suponen un riesgo mayor al tratarse —repito que por experiencia propia— casi de un «todo o nada» [1], los microviajes, «escapadas» o pequeños viajes de corta duración cuyo destino sea algún punto de la geografía nacional, van ganando presencia e importancia en las opciones que vamos prefiriendo en los últimos meses. Pueden ser tanto o más agotadores que otro tipo de viajes, pero permiten concentrarnos en un elemento concreto, que suele ser aquel que motiva o articula el propio viaje y establece los parámetros de la experiencia vivida. En esta ocasión la excusa la puso una «quedada bloguera» de gente aficionada a la cocina. Mi mujer me comentó hace unas semanas que se organizaba una en Santiago de Compostela, ciudad que yo visité con dieciocho años pero que ella aún no conocía, miré opciones y con Ryanair fuimos y volvimos por apenas [2] sesenta euros cada uno; una ganga. Alguna ventaja sigue teniendo ser residente canario y el descuento que se nos aplica por esta condición en los viajes nacionales.

Catedral de Santiago de Compostela


Decidimos coger tres días para dedicar dos a visitar la ciudad con calma y dedicar el tercero, en este caso en medio, al evento ludicofestivo que usamos como excusa. Con dos hubiese bastado, porque el viernes ya habíamos recorrido la ciudad, la parte antigua que es la que realmente resulta interesante, varias veces. Es posible que sea necio asegurarlo, pero yo tengo serias dudas de que nos quedase una sola calle del casco antiguo por la que no hubiésemos pasado al menos dos veces en ese día. Vamos, que con dos días era más que suficiente para hartarse a ciudad y marisco y, en consecuencia, gastronomía típica. Pero menos mal que optamos por la solución de tres días, porque ayer domingo amanecimos gástricamente destrozados por la susodicha gastronomía y decidimos languidecer en la habitación del hostal a la espera de la hora de salir para el aeropuerto y coger el avión. Aquí toca agradecerle al dueño del Lar de Compostela que nos dejase salir a la hora que mejor nos viniese dado nuestro lamentable estado sin cobrarnos «salida tarde».

La quedada bloguera resultó ser muy divertida. Mira que llevo años reencarnándome, blog tras blog, en esto de ser un exhibicionista, pero nunca me había dado por apuntarme a una. Y resulta que me animo de compañero para una quedada de blogs de cocina. Me junté con otros acompañantes, en este caso que venían de Lisboa, y nos lo pasamos genial durante horas. Una forma genuina de conocer gente y socializar fuera de las redes sociales como Facebook. Pero como yo iba en condición de hombre florero, ya se encargarán los blogs del sector de dar la debida y merecida cuenta del evento, como la crónica del mismo narrada por su promotor.

Por el Mercado de Abasto de Santiago de Compostela


Si no hubiese sido por la quedada, seguramente Santiago no hubiese estado dentro de nuestros planes inmediatos. Tal vez como visita puntual de un viaje por Galicia que llevamos tiempo queriendo hacer. De hecho se volvió a dar ese fenómeno de cargar con la cámara y apenas sacarla de la mochila porque, sinceramente, ya ando un poco harto de «piedras»; sin querer desmerecer o dar lugar a creer que siento desprecio alguno con estas palabras a la merecida importancia histórica, artística y/o arquitectónica de las mismas. Pero es lo que tiene la construcción sacra. Si uno no es especial fanático de la Historia del Arte, de la arquitectura o, en general, del corpus de conocimiento que derive en un aprecio especial de los matices arquitectónicos y artísticos, después de haber visitado otras tantas ciudades donde su atractivo principal pasa por la arquitectura y el arte dedicado y destinado a alabar al Señor, la Catedral de Santiago, con toda su imponente y magistral presencia, que sí que reconozco que la tiene, acaba pareciendo «una más». Al resto de segundonas que pueblan el resto de las calles ya es que ni les prestas atención. Aunque sí que confieso que el Mercado de Abastos me llamó la atención. Ese me gustó y recomiendo visitar en un día de especial movimiento (en nuestro caso el sábado) a primera hora.

La gastronomía, tan alabada y recomendada por aquellos conocidos que se enteraron que íbamos, no corrió mejor suerte que la arquitectura y el arte. Es posible que tuviésemos mala suerte eligiendo los sitios, pero viviendo en un lugar rodeado por el mismo mar Atlántico que baña las costas gallegas, no encontré especialmente memorable aquellos platos que decidimos elegir. Acabamos de pulpo a la feira hasta las narices, y la mariscada… En cuanto al lacón con grelos, no es una carne que me hiciese sentir como un quinceañero que acaba de conocer a la chica de sus sueños. En fin, que no sentí que comiese especialmente bien, y que tal vez siendo gastronómicamente más modestos, yo sigo prefiriendo las fritadas o parrilladas de pescado que a veces tengo el placer de comer en muchos restaurantes de las costas isleñas, con ese gofio escaldado que tan rico queda de compañía. Por cierto, dentro del anecdotario personal, me ha pasado con el pan gallego algo parecido a lo que con la cocina china. Un día descubrí que la verdadera cocina china tradicional no tiene nada que ver con la que uno lleva años comiendo tan bien condimentada con el glutamato monosódico. La verdadera comida china es infinitamente mejor. Con el pan gallego me pasó al revés. Acostumbrado a la versión exquisita del pan gallego que uno encuentra cuando la compra en los hipermercados, no hubo trozo de pan que te pusieran con la comida que, en lugar de corteza, no tuviese una espesa cáscara que partir con los dientes. Viene a ser como el marisco de los panes, con su concha casi inmasticable.

Pero más allá de las malas experiencias de este viaje, lo realmente genial, lo que ha merecido la pena y por lo que merecería la pena repetir si se presentara la ocasión, y eso sí que no se lo puedo negar ni quitar, fue la compañía de los blogueros aficionados a la cocina y de sus acompañantes.


[1] No quiero volver a hablar del viaje a Florida.
[2] Lo curiosísimo de Ryanair es que si bien aún sigue siendo barato, te cobran absolutamente por todo. En principio no me parece mal que te exijan cuidado con el peso que eliges llevar, pero que te cobren 32 € adicionales en concepto de gastos administrativos por la gestión de cobro cuando pagas con la VISA me parece UNA ABSOLUTA BARBARIDAD. Estamos hablando de que el 25% de lo que costaron los pasajes se fueron en esos 32 € de impuesto revolucionario por ser víctima de los tiempos que corren y usar el pago con tarjeta de crédito.

domingo, 3 de abril de 2011

'Guerra de regalos'

Más o menos empecé el año 2010 con la intención de releer toda la saga de Ender de forma más o menos seguida. Estando en Madrid compré en el dispensador de libros de Príncipe Pío la primera novela porque había desaparecido el ejemplar que tenía desde hacía veinte años y poco después me puse a leerla en la cama, escondido de las frías noches madrileñas. Tras ello descubrí que el autor había publicado dos novelas cronológicamente situadas en el inmenso hueco temporal que había entre la infancia de 'El juego de Ender' [mi reseña], quizás una de las mejores novelas de ciencia ficción que se han escrito, y la edad del profeta de profetas de 'La voz de los muertos'. Pospuse la lectura de la que originalmente era la segunda novela de la saga hasta haber leído las dos nuevas entregas.

Cuando leí 'Ender en el exilio' [mi reseña] me llevé un doble chasco. El primero porque considero que la novela no está a la altura de toda la saga. El desarrollo es algo lento y el final me parece excesivamente acelerado; celeridad que le restaría fuerza al desenlace si éste, ya de por sí, no fuera bastante malo articulándose como un diálogo digno de cualquier culebrón sudamericano. El segundo desencanto lo produjo el enterarme que no le correspondía el segundo puesto ordinal, sino que realmente vendría a ser la tercera en la nueva épica. Maldita sea; finalmente no conseguiría leer la saga completa en el orden que le corresponde a los acontecimientos.

Sin embargo aún quedaba el siguiente —o mejor dicho, anterior—, 'Guerra de regalos', por el que pagué el módico precio de 12 €. Tras leerlo casi he cambiado de opinión: 'Ender en el exilio' es un buen libro, comparado con 'Guerra de regalos'. Y durante un par de días me acompañó la sensación de que habían sido los peores 12 € que había invertido nunca. Si no fuese porque conscientemente sé, de forma categórica, que hay muchas cosas aún peores en las que he despilfarrado cantidades incluso superiores.

Entonces terminó. Zeck se puso de pie y corrió hacia su padre y lo abrazó, como hacía siempre, pues consideraba que cuando un sermón terminaba algo del polvo de luz del cielo debía quedar aún en las ropas de su padre. Y si Zeck podía abrazarlo con fuerza, se le podría pegar algo, y así estaba en disposición de comenzar a ser puro. Porque el cielo sabía que no era puro por ahora.

Tengo la sensación de que Orson Scott Card ha intentado construir un puente de crecimiento emocional entre el niño retraído y dispuesto a aniquilar a cualquiera para evitar que volviera a meterse con él de 'El juego de Ender', y el adulto paciente y entregado a la causa ajena, casi un santo varón, que se nos presenta en 'En la voz de los muertos'. Aunque a mi parecer es innecesaria esa descripción del proceso, está claro que ha querido recalcar que desde muy pronto el niño Ender posgenocidio decidió que la cultura de poner la otra mejilla era la más adecuada, por lo que para pelear sólo le quedan los argumentos y la palabra. En fin, que acaba resultando un pelín pastiche y empalagoso para —siempre hay que tener en cuenta eso— mi gusto.

Es, sin duda, el peor libro de la saga y resulta completamente prescindible en cuanto al disfrute de toda ella. Incluso recomiendo ignorar su existencia para no mancillar la historia de Ender, si se opta por leerla o releerla. Aunque no he seguido el ritmo de lectura de la saga que en primera instancia me propuse, desde luego la lectura de este volumen ha conseguido quitarme las ganas de seguir con ella.

sábado, 2 de abril de 2011

Sin embargo, ciencia del y para el espíritu

Hoy será breve: ¿Qué ven de raro en la siguiente imagen? Tómate tu tiempo, si lo necesitas.


Para el que no lo haya hallado aún, aquí va una pista: mira el epígrafe bajo el que se encuentran los títulos de los libros que aparecen en la imagen. ¿Sigues sin entenderlo?

Es raro que pasee por la zona, pero cuando lo hago y decido entrar en El Corte Inglés de Mesa y López, es más raro aún que no me acerque a la sección de Ciencias a curiosear qué libros tienen. Apenas son dos estanterías con relativamente pocos libros. Así que el tiempo que lleva revisar las existencias es relativamente inexistente. Pero siempre acabo pillándome un cabreo monumental porque justo al lado, bajo el mismo concepto se encuentra toda una estantería llena de libros que alaban la religión de uno de los dioses más sanguinarios que ha visto la Humanidad. Y que sus discípulos no se quedaron atrás durante siglos; en cuanto a sed de sangre infiel se refiere.

Que a mí me conste, llevo viendo ese pequeño despiste desde antes de las últimas Navidades. A mí, particularmente, me molesta mucho lo que considero una malintencionada manipulación, pero como soy un tipo cobarde relativamente pacífico, siempre acabo tragándome la bilis y yéndome mosqueado. Hasta ayer, que tal vez por efecto de la cerveza que me tomé antes, le saqué una foto y le dije a la primera chica que me encontré allí que por favor lo cambiaran lo antes posible, que ya estaba un poco cansado. Tal vez no fuera el primero, porque ella bajó la mirada, creo que se sonrojó y reconoció que era un tremendo error de agrupamiento, pero —la excusa— desde que habían recolocado todos los libros no habían tenido oportunidad de cambiar el letrero.

Como decía, hace meses que lo veo así, así que nada me hace creer que lo cambiarán. Y aquí va un poco la duda. Estoy por escribir una queja a quien corresponda, pero ahora mismo no sé a quien corresponde. Buscando he visto que hay muchas más asociaciones de consumidores [@ Gobierno de Canarias] de lo juicioso. Tal vez lo correcto sería dirigirse directamente a la Dirección General de Consumo [@ Gobierno de Canarias] o, directamente, al Defensor del Pueblo [Diputado del Común].

¿Qué tal si hacemos una manifestación frente al establecimiento?

¡Pásalo!

lunes, 28 de marzo de 2011

Profanation y SilverSprite

Me daba un poquito de pena dejar la cosa como estaba. Así que, antes de meterme con otro tema, me puse a juguetear con SilverSprite. Para el que no lo sepa —y le interese, claro— SilverSprite es una capa de adaptación que facilita ejecutar código XNA, en teoría con apenas cambios en el código, en Silverlight [@ Wikipedia] que a su vez es, para quien no lo sepa —y también esté interesado—, un framework pensado originalmente para desarrollar aplicaciones multimedia embebidas en páginas Web, a grosso modo. Viene a ser la respuesta de Microsoft a la plataforma Flash de Adobe y al malogradísio JavaFX de Sun/Oracle. A día de hoy, a la espera de su quinta revisión que incluye aceleración 3D y muchas cosas más, es otra filigrana tecnológica que permite también ejecutar aplicaciones en el escritorio, directamente. Sin entrar si es mejor o peor que las otras alternativas, ni tampoco si se usa más o menos en la actualidad para hacer cosas interesantes, o de que ya está HTML 5 para todo esto, lo cierto es que al ser (casi) multipltaforma [1] el que tengamos la posibilidad de ejecutar las aplicaciones hechas en XNA en la Web a modo de demostración de lo que se puede esperar en otras plataformas es algo que a mí, sinceramente, me parece cojonudo. Si cuajan MonoGame y/o ExEn, significaría que el mismo código sería ejecutable en dispositivos que van desde el iPhone hasta Xbox 360, pasando por Android, el Mac, el PC y el Windows Phone 7. Para empezar, no está nada mal. Por supuesto, en todo momento estamos hablando de juegos 2D, ya que toda la parte de 3D sigue estando en el aire en cualquiera de las alternativas existentes a día de hoy. ExEn es el que parece, dentro de su desarrollo actualmente privado, que dedicará más esfuerzo en breve a implementar parte de las API 3D de XNA 4. Ya veremos.

En mi caso el trabajo lo tuve que realizar en la máquina virtual Windows de que dispongo. Con MonoDevelop tuve muchos problemas para compilar el código Silverlight usando Moonlight SDK. Pero una vez decidido a ponerlo en marcha, y optar por hacerlo con Visual Studio, la cosa fue más o menos sencilla [2]. El esquema general a seguir es el que se encuentra en la página del proyecto SilverSprite. A partir de ahí se exigen algunos cambios menores. En mi caso, del código escrito directamente sobre MonoGame, tuve que cambiar la parte de detección de los toques en la pantalla, que directamente no existen en el API de SilverSprite, y que ahora se controlan con el ratón. También tuve que cambiar la llamada al método Begin que se realiza sobre la instancia SpriteBatch asociada a la clase del juego, ya que se exigen más parámetros. También tuve que convertir todos los sonidos a MP3 y, aprovechando, les bajé la calidad para que la descarga desde Internet no supusiera un trauma. A nivel de invocación del API de sonido también hay algunos cambios menores, pero nada significativo. Quitando el pequeño problemilla con el archivo XAML mencionado en la anotación al pie de artículo, calculo que todo el proceso me llevaría cosa de una hora, aproximadamente. A partir de ahí lo estuve probando en diferentes navegadores. En el que peor resultados obtuve fue
con Safari. El movimiento no terminaba de ser bueno, haciendo cosas raras después de cada salto. En el resto, Chrome, Firefox, Opera e Internet Explorer (en la máquina virtual), la reproducción era exactamente igual a como funciona en el simulador de iPhone.


En fin, una alternativa interesante; o una curiosidad inútil más. Ya veremos.

Al que quiera perder unos minutos con mi prueba de concepto, la podrá encontrar aquí. Si da la casualidad de que alguien tiene la última versión de Moonlight funcionando en su equipo Linux y quiere probar, que me diga qué tal le va.


[1] Ya es de sobra conocido el desprecio que siente Microsoft por la plataforma Linux. Pero también es conocido que ahí donde uno no quiere perder su tiempo, aparece gente dispuesta a ello. Para el mundo Linux existe Moonlight, proyecto auspiciado por el marco del proyecto Mono. Para todo aquel que esté interesado en probar lo de hoy en una máquina con Linux.
[2] La cosa incluso hubiese sido más sencilla si no me hubiese equivocado en una letra a la hora de referir el espacio de nombres en el que se encontraban las clases del juego. En el archivo XAML de la aplicación, ahí donde dice que se ponga «clr-namespace:» yo puse «cls-» y estuve como cosa de una hora intentando averiguar porqué demonios aquello no funcionaba ni a tiros.

sábado, 26 de marzo de 2011

Recocido de Profanation sobre cama afrutada de XNA y con relleno de MonoGame (o XNATouch)

Contaba en la entrada de ayer que tenía ganas de hacer un juego para el iPhone y que había estado buscando durante días algo con lo que desarrollarlo resultara bueno, bonito fácil y barato. También contaba que, finalmente y descartando los entornos integrados, había decidido hacer sendas pruebas de concepto con cuatro de las chopocientas mil alternativas basadas en los lenguajes que a día de hoy exiten para desarrollar para este dispositivo. Y que de las cuatro había decidido empezar con la que, sospechaba, me resultaría más fácil dado que con el lenguaje de programación C# es con el que más años de experiencia tengo y a estas alturas conozco bastantes truquillos de su sintaxis y buena parte de sus interioridades, amén de que me resultaría más comprensible el código que viese en los ejemplos sin tener que andar intentando averiguar para qué servían esos corchetes, a qué venían esos puntos y coma o por qué se metía ese bloque de código indentado en este sitio y no en uno más arriba. «¿¡Pero de dónde narices ha salido esta variable!?»

Las dificultades de hacer un (buen) juego y el objeto de la prueba de concepto.

Si me pidiesen a mí, absoluto lego en la materia, que hiciese una lista ordenada, de mayor a menor dificultad, con los elementos más difíciles para conseguir un buen juego, diría que en primer lugar estaría, sin lugar a dudas, lo que vendría a ser a modo abstracto el diseño, que incluiría cosas como el concepto, los elementos de jugabilidad, etc., etc. Lo pongo el primero porque una cosa es tener una idea como, por ejemplo, «voy a hacer un juego en el que el jugador tenga que mover unos bloques por un nivel para poder salir de él» y otra muy distinta hacerlo. Lo que vulgarmente se conoce en el refranero popular como «del dicho al hecho hay un gran trecho». Vale, lo del laberinto es fácil y la idea pinta bien, no lo voy a discutir. Ahora diseña veinte o treinta niveles, con el adecuado incremento de dificultad de uno a otro, para que el jugador no lo termine en cinco minutos, pero que además no sea tan difícil como para abandonarlo frustrado. Si alguno no me cree que se ponga a diseñar laberintos en donde el jugador tenga que ir pasando por una serie de puntos para activar puertas secretas y tal y tal y que, en resumen, resulte interesante.

Después de las tareas de diseño estaría la parte gráfica. Hay gente que dibuja muy bien y esto lo tienen ganado. Para mí no y es algo con lo que tengo que lidiar si finalmente quiero hacer algo que resulte interesante. En mi caso es un elemento limitante y no descarto que, llegado el caso, acuda a un freelance para encargarle los gráficos. Es asombrosa la cantidad de sitios en Internet que son infraestructuras de proyectos para contratar freelancers y hacer seguimiento del trabajo. Pero hete aquí que el Inglés se vuelve nuevamente imprescindible. En cualquier caso, en este punto quería evitar enfangarme con esto.

Ya en tercer lugar, y sin desmerecer otros muchos aspectos también complicados como por ejemplo el sonido, para mí estaría la programación en sí y, dado que esta es la que en primera instancia me preocupa a la hora de tomar una decisión, es sobre este término que planteé la prueba de concepto. Por ello, para poder concentrame en el código, tenía que salvar de alguna forma los dos apartados anteriores. Y no se me ocurrió mejor forma que hacer un remake de algo ya existente. Esto me quitaría el problema de los gráficos (copiar con un poco de trabajo los originales, si fuera menester) y del diseño del propio juego (copiar el original sí o sí). No se trataba de hacer el juego entero, ni siquiera toda su funcionalidad; simplemente buscaba concentrarme en cómo se podía hacer «aquello de entonces con esto de ahora» y llevar a la práctica dos o tres de las características del original. Además de que se podría incurrir en violación de derechos de propiedad.

Abu Simbel Profanation

Supongo que todos los que crecimos adorando un ordenador y siendo pioneros en esto del ocio electrónico basado en ordenadores personales, tendremos nuestros juegos favoritos. Esos que cuando en alguna conversación de cuarentones nostálgicos se empiezan a enumerar, revivimos con especial entusiasmo. Yo tengo muchos, en particular los de Ultimate Play the Game [@ Wikipedia] y los de Dinamic Software [@ Wikipedia], de mi época de Spectrum (de 12 a 15 años). Pero si hay uno en particular que encabeza la lista es el de Abu Simbel Profanation. Para mí este dificilísimo juego de 1985 (yo tenía 13 años), del que creo que no llegué a pasar de la pantalla dieciséis, supuso una revolución en los juegos de Spectrum en el género de plataformas y se trata de uno de los dos o tres que siempre quise versionar para otras plataformas. Cuando empecé a hacer mis pinitos con el código máquina (lenguaje ensamblador) para el Commodore, intenté implementar la impresión del mapeado de pantallas con superbloques [1]. Creo que durante una semana gané todos los premios al ratio de cuelgues de ordenador por hora causados por saltos condicionales fuera de código y por accesos a memoria fuera de rango. Vamos, que desistí frustrado.

Con esta prueba de concepto parecía que esta iba a ser la oportunidad de, si no todo, por lo menos programar las primeras pantallas de este genial juego. Tocaba «desempolvar» el emulador de Spectrum [Viejos tiempos para el jugador casual] y empezar a capturar las pantallas. Elegí Profanation para hacer la prueba de concepto del código con XNA. Ya tenía diseño y gráficos resueltos. Tan sólo había que recortar cada frame de la animación y ya estaba. En teoría.

Los gráficos, las escalas y primeros tropiezos

Aunque no viene mucho al caso, decir que es asombroso que cuando uno los necesita no funcionan. Justo un par de días antes de ponerme con la modernización actualicé tanto GIMP como Inkscape en mi equipo y dejaron de funcionar. Cada cierto tiempo lanzo el (ahora temido) comando de actualización de MacPorts. Sin saberlo, con la última descarga masiva de actualizaciones había conseguido dejar inservibles tanto uno como otro. Vaya mala suerte. Así que harto de andar para delante y para atrás intentando resolverlo abrí la App Store de MacOS X, busqué y me pillé dos de diseño vectorial y PixeImator. 60 euros más pobre pero me quité del golpe los problemas. De los primeros no estoy muy contento, pero el segundo es una gozada. El software en realidad es muy barato —me apunto que un día tengo que escribir sobre esto— y no me arrepiento del dinero gastado. La integración de GIMP en Mac era inexistente (se requiere X11), algo que le restaba feeling al usarlo. Vamos, me olvidé de él en diez minutos de usar el nuevo. Visto retrospectivamente está claro que no era amor lo que sentía por él.

Tras este inciso me puse a pensar en cómo sería el diseño en el iPhone, que tiene una pantalla de 320 x 480 y en el iPhone 4, en el mismo área, una resolución de 640 x 960, mientras que el juego original tenía 256 x 192. Además que había que meter botones en la pantalla para manejar al machango. Aquí me encontré que los puntos por pulgada de las pantallas de ordenador tienen una densidad bastante menor que la pantalla del terminal y que esto podía conducir a errores en las escalas. Después de hacer un boceto del diseño de la pantalla y exportarlo a la resolución del iPhone, basta con reajustar la densidad de puntos. El cálculo es tan sencillo como aplicar una relación de proporciones o una regla de tres donde comparamos el alto de la pantalla del iPhone con su densidad de puntos (163 ppp) a cómo debería verse en una pantalla normal (96 ppp) o la del portátil (112 ppp) [2]. Vamos, Altura = 320 x 96 / 163, lo que da unos 188 píxeles de alto. Reescalar la imagen y comprobar si el botón ha quedado de un tamaño adecuado para pulsar con el dedo gordo —yo lo tengo muy gordo— poniéndolo directamente sobre nuestra pantalla y si los gráficos originales quedan mínimamente distinguibles. Así es como queda el resultado a la escala de la pantalla del iPhone, dependiendo de la densidad de puntos de tu propio monitor, claro:


Hombre, yo no sé ustedes, pero si bien los botones quedan a un tamaño más o menos prudencial en la pantalla, el protagonista resulta prácticamente indistinguible. Iba a tocar reescalar todo y buscar la forma de que todo encajase en pantalla. En última instancia se trataba de una prueba de concepto y tampoco tenían que ser las mismas pantallas. Bastaba con que el personaje se pudiese mover por algunas plataformas y saltase, controlar las colisiones con algún enemigo tonto y poco más. Vamos, hacer un mix de Abu Simbel Profanation y Mario Bros. Visto lo cual, me puse a rehacer los gráficos. Tuve una especie de deja-vu porque esto mismo hice, de forma algo más cutre, en octavo de EGB pasando los sprites a hojas de cuadraditos para calcular los códigos binarios de cada uno de los bytes que componían el gráfico de 16x16 bits, pero ahora capturando pantalla y reescalando el bicho a 32x32. Vamos, un curro. Y se suponía que la intención era no perder tiempo con esto.

Entonces pensé que tal vez no tendría que hacerlo. Hace años tuve la oportunidad de jugar a un remake que tropecé por casualidad en la zona de ramakes de Computer Emuzone, en la de Remakes Zone o en alguna similar. Estaba hecho en Java y la verdad que era algo simplón en gráficos, pero resultón. Para mí más que suficiente. Busqué y enseguida lo encontré. Y no sólo ese. El autor ha hecho otra versión bastante mejor y que, además, también está para Mac. Aún mejor, se puede descargar el código fuente desde su página Web. Pero aún queda lo mejor de lo mejor: ¡¡¡Viene con los gráficos!!!

Si son nostálgicos de los juegos de 8 bits, en la página de M.A. Software podrán encontrar algunas cosas muy interesantes. Este hombre es un crac.

A base de rapiñar los gráficos de Miguel Ángel, ya tenía resuelto el segundo asunto en orden de complejidad. Aunque bueno, todo todo no lo he rapiñado. También quise aportar mi granito de arena en el apartado gráfico y añadí la secuencia de una muerte bastante truculenta.


Tocaba ponerse a aprender XNA.

¡Ya sé XNA! Al menos los cuatro conceptos básicos

En Internet hay muchísima documentación sobre XNA, suficiente para aprender, pero yo me fui directo a la bibliografía. En mi caso recurrí a un libro que me ha parecido muy entretenido y bien escrito: 'Beginning XNA 3.0 Game Programming' [3]. Tras una lectura rapidísima de los capítulos dedicados a la programación en 2D (de momento no me interesa la parte en 3D), puedo concluir que XNA es muy sencillo de aprender y que tiene cuatro conceptos básicos que comprender: la clase SpriteBatch, heredar de GameComponent —mejor aún de DrawableGameComponent— y los métodos Update ( GameTime gameTime ) y Draw ( GameTime gameTime ). Con estas tres ideas, y cargando las imágenes en clases Texture2D uno ya se puede meter a hacer algo que resulte interesante.

Aunque sea por el placer de escribir tres líneas de código, recomiendo a todo el que tenga curiosidad que intente mover un sprite por la pantalla. De ahí a conseguir un hit en Xbox 360 no hay nada. Y confieso que me ha sorprendido la facilidad con que se aprenden los antes mencionados conceptos básicos y lo fácil que es leer el código C# que hay de ejemplo por todas partes.

Yo tardé un día en leerme los cuatro primeros capítulos, los dedicados al 2D, y sentarme a escribir código con más o menos seguridad sobre lo que estaba haciendo.

Manos a la obra. ¡Qué divertido!

Como usuario de Mac, y sin querer recurrir para este caso a la máquina virtual que siempre tengo con Windows, mi intención era hacerlo todo con software que se ejecutase de forma nativa en mi máquina. Para ello basta con descargar Xcode con el SDK de iPhone [4], instalarse la última versión de Mono para Mac, hacerse con la versión demo de MonoTouch, instalar MonoDevelop y bajarse la última versión de MonoGame, antes conocido como XNATouch. En mi caso me lancé directamente a usar la versión del repositorio, la 1.6, ya que en ésta los espacios de nombre son los mismos que los del XNA original: Microsoft.XNA.Framework.

Repito que tras la experiencia con el apartado gráfico, la idea final era hacer una especie de Mario Bros usando los gráficos del remake Abu Simbel Profanation Deluxe. Pero al resultar tan relativamente sencillo hacer algo con XNA, te acabas enganchando y te dices, «bueno, voy a meterle ahora esto», y así una tras otra. Vamos, que lo que inicialmente había pensado me llevaría tres días, lo acabé convirtiendo en seis o siete días en los que me lo he pasado muy bien haciendo que el machango fuese de un sitio para otro. En dos días ya tenía bastantes cosas hechas, pero lo siguiente era meter sonidos, hacer un scroll de pantalla, meter distintos enemigos con animaciones diferentes, que el muñeco mirase en las diferentes direcciones como hacía el original, etcétera, etcétera.


Pero no era totalmente gratuito este sobre esfuerzo. MonoGame es un producto bastante verde, según lo que se lee en diferentes sitios. Confieso que tenía la creencia de que la cosa haría aguas por todos lados y que la mitad de lo que hiciera no funcionarían. Pero no. Cosa tras cosa que iba metiendo el juego seguía funcionando. Y muy bien, todo sea dicho. Sobre todo porque el código espagueti con el que lo hice dudo que sea el mejor para probar el rendimiento del juego. Si no hice más cosas es porque, precisamente, como no esperaba hacer mucho, la mayoría de las primeras cosas las hice en plan hard coded, como las cuatro pantallas que al final reproduje del juego original. Hay que ver la cantidad de horas que me he metido calculando las coordenadas de cada uno de los bloques que había que pintar en la pantalla.

Por cierto, en la captura aparecen unas áreas rectangulares de colores. Esto se debe a que, ya puestos a meter cosas, también podía superponer las áreas de colisiones para comprobar si todo funcionaba como debía cuando uno se aproxima a un enemigo.

Un pequeño apunte sobre música

Ya como último paso antes de dar por cerrada la prueba de concepto, se me ocurrió meter algo de banda sonora al juego. Los efectos de sonido también se los rapiñé a Abu Simbel Profanation Deluxe, pero me apetecía probar a meter una música de fondo mientras jugaba. Se me ocurrió recurrir a RKO, donde hay cientos de versionados de temas musicales de los juegos del Commodore. Hay algunos muy buenos. Ni corto ni perezoso escuché unos cuantos de los últimos que se habían publicado y me decanté por el tema 'Cauldron II (The Witch Who Stepped in Dub)', de Sound of Hazel (http://www.soundofhazel.com). Le da marchilla a la prueba de concepto. Y, lo mejor, es bastante sencillo dejarla sonando. Tanto como crear una instancia de efecto de sonido e indicarle que se reproduzca en bucle. Pongo algo de código.

public static void PlayMusica ()
{
   musicaInstance = musicaJuego.CreateInstance ();
   musicaInstance.Volume = 0.2f;
   musicaInstance.IsLooped = true;
   musicaInstance.Play ();
}

Reproducir el resto de efectos de sonido es exactamente igual de fácil.

El resultado

Está extendida la creencia de que una imagen vale más que mil palabras. Y que un vídeo más que mil imágenes. Pues por no llevar mucho la contraria, aquí va un pequeño vídeo sobre cómo ha quedado finalmente la prueba de concepto. La chicha tarda un poco en empezar, sean pacientes.



Pero… el simulador no es el dispositivo

Confieso que he quedado gratamente sorprendido por el trabajo de la gente de MonoGame. Me preocupaba el hecho de no conocer nada de XNA y tener que aprender con un producto que, tal vez, fallase más de la cuenta. De hecho, cuando uno descarga el código desde el repositorio del proyecto, la mayoría de las demos que lo acompañan no funcionan. Pese a ello, el proyecto empezándolo desde cero y aplicando las pautas aprendidas en el libro mencionado antes ha funcionado en todo momento.

Sin embargo hay algo que me sigue preocupando. En las pruebas con el simulador, todo funciona perfectamente. Rara vez los frames por segundo bajan de 58, sabiendo que el hardware gráfico del iPhone sólo alcanza los 60 fps. Pero el simulador no es el dispositivo, y algo que funciona perfectamente en el simulador puede ir fatal en el hardware final. Esto supone un riesgo enorme a la hora de adoptar esta tecnología. Pueden significar muchas horas de trabajo tiradas a la basura y/o 400 euros mal invertidos [5] si resulta que desde el principio descubrimos que la cosa no tira. Pero ya se sabe, quien no arriesga no gana. Y tal vez sea mejor perder ese dinero que echar 100 horas en algo que luego no va a funcionar y que seguimos con la incertidumbre hasta que decidamos gastarnos la pasta.

Siguiente paso

Mientras decido si invertir el dinero o no en MonoTouch, ya voy pensando en qué haré a continuación. En la lista el siguiente es Cocos2D. Aunque en teoría lo ideal sería repetir lo mismo que he hecho con MonoGame, la realidad es que no se me apetece —y no voy a repetir de nuevo— lo que he hecho. Supongo que tiraré por algún otro clásico del que haya también gráficos disponibles que poder buitrear. Aunque esta vez espero no dedicar tanto tiempo a pulir pijadas y llenar la prueba con detalles que a la postre son insignificantes en el valor de conjunto. Ya veré. Lo único que sé es que en las últimas dos semanas me lo he pasado genial haciendo esta prueba de concepto.



[1] Si mi memoria no me engaña, y no empiezo a inventarme ya las cosas, leí por primera vez esta idea del «superbloque» en un artículo sobre programación de videojuegos que se publicó en MicroHobby o en MicroManía. Aunque a estas alturas ni estoy seguro de que fuera ese el término ni de que fuera en una de esas revistas. El superbloque vendría a ser lo que hoy se denomina en todas partes como tile (mosaico).
[2] En http://members.ping.de/~sven/dpi.html hay una calculadora que te dice los dpi de tu pantalla en función de la resolución.
[3] Actualmente la versión 4 de XNA deja como obsoletas algunas de las cosas que estaban disponibles en la versión 3. Sin embargo, tanto el proyecto MonoGame como la alternativa ExEn, actualmente en desarrollo privado, no soportan completamente la última versión de XNA.
[4] Para poder probar el código realizado con MonoTouch hay que contar con el simulador que ofrece Apple con el SDK. Para ello es necesario darse de alta en el programa de desarrolladores de Apple (que es gratis) y ya se podrá descargar. Alternativamente, y desde hace poco, también se puede conseguir directamente en la App Store pagando 4€.
[5] En realidad algo menos teniendo en cuenta que sea cual sea la opción que finalmente se elija para hacer un juego (o cualquier otra aplicación de iPhone) será necesario contar con la licencia de programador iOS, que al cambio viene costando unos 80€.

viernes, 25 de marzo de 2011

El blues de los momentos perdidos

Esta es la predecible, y seguramente inevitable, continuación de 'El ABC de los tiempos perdidos'. Entonces no me preocupaba demasiado. Eran unas más que merecidas vacaciones. Pero tras cinco meses en las listas del paro, y con varios rechazos a mi «impecable» curriculum —al menos eso es lo que afirman las personas que llaman para entrevistarme— por cuestiones de idioma, confieso que empiezo a preocuparme ligeramente. Aunque no puedo decir que me angustie aún. Más bien todo lo contrario. En estas últimas tres semanas apenas he pensado en el asunto. El «truco» está en no amargarse demasiado con ello y, lo principal, andar ocupado siempre con algo. A poder ser algo que me llame la atención. Además de seguir siendo optimista. Pesimistas y amargados ya hay muchos en el mundo. Y aún tengo margen de sobre para maniobrar. De hecho hay varios indicadores que apuntan a que acabaré presentándome como freelance. Pero de eso ya hablaré en otro momento.

Dentro del abecedario de intenciones de diciembre, había alguna letra relativa a programación para el iPhone. El desarrollo para terminales móviles es cada vez más demandado. Pero que algo se demande nunca me ha empujado a seguirlo. Tiene que llamarme la atención. Y aquí es dónde debería decir que en los dos últimos años, con la aparición de dispositivos herederos del iPhone, además del propio iPhone, sin dejar de lado el iPad, la programación para terminales móviles se ha convertido en algo que me llama poderosamente la atención. Llevo tiempo queriendo hacer algo para iPhone y presentarlo en la App Store. Tan solo por el placer de hacerlo e intentarlo. Aunque también para ver si doy el pelotazo y me dedico a vivir con Curro en el Caribe. Y tal vez esta última intención ha eclipsado lo anterior y no me he puesto a ello antes. Se me ocurren cientos de ideas a lo largo del día, pero casi todas las voy descartando por parecerme, después de darle unas vueltas, que el esfuerzo no compensa o que ya hay cientos de cosas similares. Así que un día sí y otro también lo voy dejando aparcado en favor de cosas que, para ser franco, tal vez me atraigan menos. Hasta que al final me he dicho que lo interesante en sí no ha de ser el resultado —tal vez los restos incoscientes de la herencia defectuosa de haber trabajado los últimos tres años en una empresa de estricto y cuasidictatorial régimen orientado a resultados, aunque no siempre la calidad con que se consiguen sea la más adecuada—, sino disfrutar en el proceso —la idea original— y, para mí lo más importante siempre, aprender durante el camino. Así que, ni corto ni perezoso, hace unas semanas me levanté a las cuatro y media de la mañana y me senté delante del ordenador a buscar información.

En octubre del año pasado, a poco de haberme comunicado la dirección que tan pronto desmantelase la oficina engrosaría las listas del paro, tuve otro de esos momentos de ponerme a programar un videojuego [1]. Lo de crear un juego es una constante en mi vida. Desde que tengo uso de razón y tuve mi primera videoconsola conectada al televisor. Curiosamente, salvo por alguna cosilla en BASIC para el Spectrum-48-k-teclado-de-goma, de los que me encantaría recuperar las fuentes, y de el Super Kutre Invaders [2], nunca me lo he tomado muy en serio. Hasta ahora. ¿Si lo que me apetece es programar algo para el iPhone, y siempre he querido hacer un juego, porqué no hacer un juego para el iPhone? Totalmente de perogrullo.

A poco que uno se ponga a mirar en Internet los SDK's, API's y entornos de desarrollo para juegos que hay, le puede sobrevenir un colapso mental. De hecho eso es lo que casi me da a mí. Tras cuatro o cinco días intentando elegir qué sería mejor para llevar a cabo alguna de las varias ideas que había estado apuntando en las semanas anteriores, me di cuenta que estaba bloqueado en un claro caso de parálisis por análisis [@ Wikipedia]. Casi desde la mañana hasta la noche encontrando alternativas y revolcándome en el fango de Internet rebuscando información y opiniones sobre cada caso. Y, sobre todo, precios. Agotador.

A continuación un mini-mapa mental de lo que fui encontrando [3]:


Si me hubiese dedicado a investigar y probar cada caso, a estas alturas aún seguiría rompiéndome los cuernos contra la mesa de trabajo. Y estoy seguro que aún hay más por ahí que sería muy interesante. Así que fui tomando decisiones para podar el árbol. Tal vez erróneamente, pero después de mi (¿nula?) experiencia con Unity, opté por dejar en segundo plano los entornos integrados y dedicarme a las API's y SDK's basadas en lenguajes de programación. En última instancia mi intención no es meterme en nada 3D de momento, por lo que buscaba algo que me resultase cómodo para hacer un juego en 2D. Lo que vulgarmente vendría a ser un Indie Game.

Después de muchos quebraderos de cabeza me quedé con cuatro opciones para ir mirando en primera instancia y hacer pruebas de concepto:

  • Cocos2D (Objective-C)
  • Sparrow (Objective-C)
  • MonoGame / ExEn (C# --> MonoTouch)
  • Corona SDK (LUA)

Leyendo la documentación, opiniones, ejemplos y estado de desarrollo, los que me llamaron más la atención fueron Sparrow y Corona SDK, basado en el lenguaje de programación LUA. De hecho, a este último le tengo muchas ganas y encabeza la lista como «muy probable». Sin embargo, dada mi familiaridad con .NET y viendo la bastísima cantidad de documentación existente sobre XNA, he optado por empezar las pruebas de concepto con MonoGame (XNATouch) y, por tanto, con MonoTouch. Después intentaré hacer algo con Cocos2D y Sparrow y, en última instancia, me lanzaré con Corona SDK y el bastante sencillo lenguaje de programación LUA.

Podría resultar curioso que no empiece directamente con los que requieren Objective-C que, además, económicamente son los que menos inversión exigen para poner algo en la App Store. Únicamente se requiere la licencia de desarrollador para iOS; algo que el resto de opciones también requieren y que, además, exigen pago de otras licencias. Llevo un tiempo programando en este lenguaje y —estoy seguro que esto sonará casi blasfemo a los apóstoles del mismo— es que cada vez me gusta menos. Por mucho que me intenten vender su sintaxis revolucionaria, rompedora y todo lo que tú quieras, cada vez me parece más una amalgama de intenciones y modernizaciones a medias. De hecho no descarto saltar a C++. Pero, como todo, es una opinión y habrá quien me corrija en mis palabras. Pero como es mi opinión, y en ella baso mis decisiones, he optado empezar por MonoTouch y usar alguna de las dos alternativas para desarrollar con XNA; sabiendo además que este mismo SDK se usa para desarrollar en PC, XBOX 360 y Windows Phone 7, que con la decisión de Nokia [4] de basar todos sus futuros dispositivos en este sistema operativo, da un buen espaldarazo al parque de móviles que podrían ejecutar el mismo código. Sin olviar que tanto MonoGame como ExEn tiene los ojos puesos en Mono for Android, lo que, en un universo idílico, daría lugar a que lo programas una vez y se podría ejecutar en virtualmente —y vender a— casi todos los dispositivos móviles que hubiera en un futuro no muy lejano.

Hacer un juego es una de las cosas más difíciles que se me ocurre en las que se podría embarcar uno. No tanto por la programación que, además de tener que lidiar con circunstancias particulares (concurrencia, eventos, tiempo real, animaciones, particularidades del hardware, etc., etc), no deja de ser código y, por tanto, aprendible en un tiempo prudencialmente breve para alguien que ya tiene suficiente bagaje. Para mí lo peor de hacer un juego —y uno de los motivos por los que no me haya lanzado antes— está en la componente gráfica. Soy nulísimo en el dibujo y un juego, al menos de forma más o menos generalizada, necesita una muy buena presentación. Por ello, de cara a las pruebas de concepto, me puse a buscar alternativas que no me exigiesen dibujar, al menos no demasiado. Pero eso, mejor, ya lo cuento mañana.

Sin olvidar, entre tanto, que el abecedario de las intenciones tiene más letras y que, visto que es imprescindible el Inglés, he de retomar su estudio lo antes posible. A ver si en unos meses puedo optar a puestos en EEUU (JobCraver). ¿Alguien tiene curiosidad por ver los rangos salariales que se ofrecen al otro lado del Atlántico? Ahora busquen en InfoJobs algún puesto equivalente y, si hay suerte, lo que ofrecen.


[1] La entrada en cuestión es 'Pues sí que está siendo un año de juegos, y algo más (y 2)'. Entonces andaba toqueteando nuevamente Unity 3D (http://unity3d.com/), pero acabé dejándolo (de nuevo) porque el diseño 3D es bastante complicado. Se tarda muchísimo en conseguir una animación interesante. De hecho yo no lo conseguí. Y eso resulta frustrante. Si ya soy rematadamente malo dibujando en 2D, no se pueden ni imaginar en 3D.
[2] En la entrada 'Tesoros perdidos reencontrados (II)' hay un vídeo del Super Kutre Invaders. Por cierto, he vuelto a perder de vista el código fuente. Suerte que se lo pasé a Moisés antes.
[3] A ver si no me equivoco o me dejo alguno fuera.
[4] Uno de tantos artículos que se publicaron en esas fechas, en concreto el 11 de febrero de 2011, en el País: 'Nokia se alía con Microsoft para combatir a Apple y Android'.

jueves, 17 de marzo de 2011

De tajinastes azules

Aprovechando una nueva visita de Sulaco [Distorsiones], nos juntamos Luis, el más-holandés-que-español/canario-a-estas-alturas y el que suscribe, para echarnos unos piscos (o tomarnos algo, como se diría en dialecto normalizado) y tirar para el monte a disparar con nuestras respectivas cámaras. Y no necesariamente en ese orden.

Eso sucedía ayer y, como va siendo norma en la vida de esta bitácora, dejo fiel reflejo en la entrada de hoy —de la víspera al pretérito, por filosofar un poco— por aquello de asegurar que, cuando tanto Luis como Sulaco sean ricos y famosos, poder alegar que yo los conocí y estuve con ellos.

Tajinaste azul

En esta ocasión, y aprovechando la época elegida para la visita, nos dejamos guiar por Luis hasta Valsequillo —en realidad Tenteniguada— y adentrarnos por caminos más aptos para cabras —o gente físicamente mejor preparada— que para proto-obesos de vida sedentaria como yo. Decía conocer el camino para adentrarnos en bosques de tajinastes azules [Echium callithyrsum], planta endémica de la isla, que florecen en esta época. En los calentamientos previos, nos deleitó con paisajes de belleza inimaginable. Luis conoce muchos rincones de la isla que la mayoría desconocemos —ya se sabe el dicho aquel de cuchara de palo…—, aunque el trayecto de ida siempre parece más una odisea de búsqueda. De copiloto acompaña siempre la incertidumbre del camino correcto. Pero aún así llegamos bien y dentro del plazo estipulado.

Lo que no estaba tan bien fue el tiempo climatológico. Al que haya estado atento a las noticias locales, aunque no viva aquí, ya sabrá que esta semana hemos batido récord en cuanto a temperaturas mínimas históricas y, aunque el día se aventuraba de mejor talante, finalmente no acompañó del todo. Tampoco podré decir que la cosa fue trágicamente mala. Supimos, o mejor dicho intuimos —aunque seguramente Punset diría que nuestras neuronas ya lo habían decidido diez segundos antes de que nosotros fuéramos conscientes de ello [1]— que la cosa pintaba cada vez peor y que era el momento de retroceder, transformando el ascenso, penoso en mi caso, por un descenso menos agotador, aunque tanto más peligroso por lo embarrado del camino, antes de que las gotillas molestas que caían acabaran convirtiéndose en una lluvia torrencial parecida a la de los días anteriores.

Tajinaste azul

En definitiva, el clima no acompañó y, como corolario a un cielo casi completamente encapotado, némesis de la fotografía colorista que la Naturaleza exige, que el trayecto fue más bien breve. En mi caso, en estas circunstancias, me cuesta mucho apreciar la belleza de un paisaje que, lo siento por sonar tan negativo y desapegado, ya tengo algo visto. Aunque reconozco que resultó entretenido ver una buena cantidad de estas plantas en el estadio final del florecimiento. Pero más entretenida fue la compañía y la conversación. La fotografía pasó hace tiempo a un estadio secundario. Es la excusa perfecta para quedar y ponernos al día del acontecer de nuestras existencias. Cada una de ellas, como lo es el tajinaste azul, particular a su manera.


[1] La referencia viene perfectamente al caso. De camino a recoger a Sulaco acontecía una entrevista radiada al ilustre Eduardo Punset en la que, por mor de su último libro, Excusas para no pensar, uno de los participantes intentaba ponerlo en un aprieto alegando tal determinismo, casi contradictorio con el dogma punsetiano de la plasticidad mental, en esta circunstancia de actuar a la cola de las decisiones que ya habían tomado nuestras neuronas tanto tiempo antes. Por cierto, que en el momento de escribir esto aparece en la caja tonta siendo entrevistado por el casi tan célebre Buenafuente.