El «game loop»; porque todo juego está encerrado en un bucle

«Game loop» básico
En mi historia como desarrollador informático, así como en mi propia vida, los gustos o las disposiciones siempre se me han presentado por rachas, por períodos de tiempo más o menos largos en los que me da una venada y me zambullo en un asunto de tal manera que, a veces, hasta me doy miedo a mí mismo. He tenido, pues, mi época de desarrollador por cuenta ajena al uso, la de programador de virus informáticos, la de hacker, la de diseñador de aplicaciones para dispositivos móviles, la de programador de microcontroladores PIC, la de desarrollo de robótica e inteligencia artificial y hasta un tiempo que me dio por el diseño de videojuegos.
Normalmente nunca consigo terminar nada serio cuando me dan estos sirocos, pero la temporada en la que me sumerjo en cada asunto (desde varios meses hasta unos pocos años) es tan intensa, que el bagaje intelectual y técnico que acumulo me sirve y me basta, la mayoría de las veces, para calmar mi sed de conocimientos y, por qué no decirlo, mi ego de erudito instruido a medias en muchos contenidos pero docto en casi ninguno de ellos.
En lo que concierne a los videojuegos, hubo varias cuestiones que me produjeron un orgasmo neuronal al descubrirlas y al explorar todas sus posibilidades casi al cien por cien, entre las que puedo destacar dos: la detección de colisiones (algo que me trajo de cabeza durante semanas y de lo que algún día hablaremos) y el bucle de juego o game loop. Todos los videojuegos del mundo mundial (mejor diré casi todos, por no pillarme los dedos) tienen una sección dentro de su código que es un bucle condicional y que se corresponde con la acción principal del programa, es decir, con el momento exacto en el que estamos jugando, sea machacando marcianos a hostias o intentado encajar piezas en su justo lugar para destuir líneas de ladrillos de colores.
Desde el ‘Pong‘ hasta el ‘Metal Gear Rising: Revengeance‘, la actividad principal de un juego se desarrolla dentro de un loop o bucle, infinito en principio, que sólo se rompe bajo determinadas condiciones ocasionadas por el usuario o generadas por el propio desarrollo de la acción en sí. Los procesadores no pueden hacer tantas cosas a la vez como podemos imaginar, es más, realmente, y por norma general, en un sistema informático sólo se puede ejecutar una tarea cada vez, lo que ocurre es que esto se realiza a tal velocidad que la sensación de multiproceso se simula cediendo el control al microprocesador en intervalos de tiempo muy cortos. ¿Cómo es posible, entonces, que en un entorno de juego parezca que, al mismo tiempo, se dispare, se muevan los enemigos, se actualice el marcador y se cambie el fondo de nuestro escenario?
Para los legos en la materia, imaginemos un rizo de instrucciones de código en cualquier lenguaje de programación que se repite muchísimas veces por segundo. Dentro de dicho rizo se realizan multitud de acciones en décimas de segundo que, en función del juego, pueden ser unas u otras, pero que casi siempre son muy parecidas: 1- comprobar eventos del usuario (se ha pulsado una tecla, se ha hecho clic con el ratón, se ha movido el joystick a la izquierda…); 2- mover los elementos del juego (el personaje principal, los enemigos, otros integrantes, ítems para recoger…); 3- detectar colisiones entre elementos (el personaje contra una pared que no puede atravesar, los proyectiles disparados contra los enemigos, un ítem que proporciona más vida contra el personaje principal…); 4- dibujar el contenido completo de la pantalla en función de todo lo anterior (movimientos, saltos, muerte, heridas, fondos…); y 5- añadir un retardo o pausa final para acomodar la velocidad de la acción de igual manera a todas las plataformas y, también, para dar un respiro a la multitarea del sistema operativo cediendo recursos (ya que un bucle sin fin, por definición, colgaría incondicionalmente la aplicación).
El siguiente código, en C#, muestra una función prinicipal Main() que, tras hacer una llamada a la inicialización de las variables necesarias, es un game loop que llama constantemente a diversas funciones que comprueban continuamente las condiciones del juego y actúan en consecuencia mientras una última función booleana partidaTerminada() no devuelva un valor verdadero.
Mostrar códigoOcultar código
private static void Main()
{
Juego j = new Juego();
j.inicializar();
do {
j.comprobarEventos();
j.moverElementos();
j.detectarColisiones();
j.dibujarContenido();
j.anadirRetardo();
} while (! j.partidaTerminada() );
}
El primero de los puntos dentro de un bucle de juego (comprobar eventos de usuario) realiza constantemente una verificación de los controles que el usuario haya podido utilizar, esto es, detecta pulsaciones de teclas de control o movimientos de mandos de juego. Se debe vigilar todo aquello que sea susceptible de ser empleado por el jugador para, en el siguiente punto, actuar en consecuencia.
En función del desarrollo del juego y de su manejo, el segundo de los asuntos (mover elementos de juego) ejecuta las acciones necesarias, como pueden ser mover el personaje hacia un lado, saltar, disparar, realizar un pausa o abandonar la partida.
El tercero de los puntos (detectar colisiones) actúa sobre las distintas colisiones que se puedan producir en el juego y las controla. Al fin y al cabo, un videojuego no es más que un montón de imágenes generadas por ordenador y moviéndose por la pantalla, y la física del movimiento de estas imágenes debe ser lo más realista posible. Así pues, por ejemplo, un personaje manipulado por el jugador no debe poder atravesar una pared que está a su derecha, por lo que el detector de colisiones ha de localizar si se ha producido un toque entre ambos para anular los movimientos a la derecha, dando la sensación de que se ha chocado con dicha pared. Asimismo, el impacto de un proyectil sobre un enemigo es una colisión que debe ser detectada, como el apoyo de sus pies sobre el suelo o un golpe contra el techo al saltar.
El mundo de la detección de colisiones es una disciplina aparte que bien podría requerir de un libro completo para su explicación, con miles de fórmulas matemáticas y mucha teoría física. Evidentemente, no es lo mismo la colisión de dos sprites en un mundo 2D, que no son más que cuadraditos chocando por alguno de sus cuatro lados, que una colisión en un espacio 3D entre figuras poligonales con formas complicadísimas. El programador deberá decidir cuánto tiempo de proceso dedica a que los microchips detecten este tipo de colisiones, desde un burdo envoltorio tridimensional que casi no permita acercarse al personaje a ningún sitio, hasta una programación exhaustiva (a nivel de píxel) que detecte un disparo dirigido a la rodilla del enemigo y le provoque una simple herida en ella, sin llegar a matarlo.

Algoritmo de colisión entre dos círculos
El cuarto de los estados de nuestro bucle (dibujar contenido) es el referido al renderizado del nuevo contenido atendiendo a todo lo anterior. La pantalla se dibuja varias veces por segundo, por lo que la sensación de movimiento es realista y fluida. En este punto se pueden también poner en orden marcadores, número de vidas, monedas recogidas, tiempo restante de juego, etcétera.
Por último (retardo), ha de añadirse un tiempo de espera que regule el paso (tiempo entre ejecuciones de loop) del bucle para que todo se vea ni muy rápido ni demasiado lento y, además, para ceder durante un instante el control de eventos al sistema operativo y nuestro juego no cuelgue el resto de aplicaciones y procesos.
Los bucles de juego pueden ser de paso fijo o variable. En un tipo fijo de paso, el juego intenta llamar a su método de actualización en un intervalo fijo y constante de tiempo. Por ejemplo, en el entorno de desarrollo XNA de Microsoft (el que se utiliza para el diseño de videojuegos de Xbox 360, entre otros) el tiempo del paso fijo por defecto es de 1/60 de segundo. Los juegos de paso variable llaman a sus métodos de actualización en un bucle continuado.
A la hora de desarrollar un juego, el tiempo de bucle es importantísimo, pues debemos tener en consideración un par de conceptos: FPS (frames per second, o cuadros por segundo) y UPS (updates per second, o actualizaciones por segundo). Lo ideal sería llamar a los métodos o funciones de actualización y de dibujado en pantalla el mismo número de veces por segundo: 20 ó 25 veces por segundo es más que suficiente para ofrecer fantasía de movimiento en un juego que se ejecuta en un teléfono móvil; entre 25 y 30 para los juegos de las consolas actuales.
Por poner un ejemplo claro: si ajustamos un tiempo de bucle a 25 FPS, ello significa que debemos llamar al método de renderizado cada 40 milisegundos (1000 / 25 = 40 ms). Como antes de hacer render se llama a los métodos de actualización de variables, posiciones, detector de colisiones y demás, tenemos que asegurarnos que todas estas actualizaciones se pueden realizar en 40 ms o menos, de lo contrario, tendremos un juego más lento.
Nosotros podemos calcular, grosso modo, el tiempo que puede tardar nuestro programa en actualizar datos y en dibujar la nueva pantalla en condiciones normales. Pero, ¿qué ocurre si nos están atacando 100 enemigos a la vez, con sus posiciones, sus movimientos, sus disparos, etcétera? Efectivamente, el tiempo de bucle no puede ser el mismo para un escenario sin enemigos que para uno repletito de ellos y muy cabreados. Es por eso que, muchos juegos, parecen ir muy bien el principio, pero en condiciones extremas se lentifican.
Lo ideal es calcular el paso del bucle con un «ni pa’ ti, ni pa’ mí». En condiciones de cero enemigos y un día soleado, un método de actualización y un método de dibujado que se quedan cortos y a los que hay que añadirles un tiempo de espera (como decíamos anteriormente) es mucho mejor que un par de métodos que ya sobrepasan el paso de bucle en ese momento y que, cuando caiga la noche y aquello se pete de alienígenas mosqueados, los continuos desfases de actualización van a hacer que el juego vaya muy lento. Lo mejor, por lo tanto, es guardar un equilibrio y, tras muchas pruebas, conseguir un ritmo o una velocidad de juego constante a costa de un FPS variable.

Velocidad constante de juego con FPS variable (vía ‘Against the Grain’)
Y todo eso mogollón de veces en un segundo y más rápido que el mismísimo Rayo McQueen. El game loop es fascinante y merece la pena, para aquel al que le apasione como a mí, estudiarlo muy a fondo y documentarse mucho antes de emprender la excitante tarea que supone programar un videojuego.
El aburrido, pero increíblemente adictivo, juego ‘Curiosity’ eleva la curiosidad humana al cubo (como poco)

‘Curiosity’
Técnicamente es el videojuego más absurdo, estúpido y aburrido de la historia de los juegos digitales, algo que ya se me podría haber ocurrido a mí y que habría tardado en codificar un fin de semana. Sin embargo, tiene ese componente de curiosidad malsana y ponzoñosa que tanto nos atrae a los homo sapiens, ese puntito cotilla que nos puede hacer pasar horas, con un iPad entre las manos, rompiendo cubitos binarios sin sospechar siquiera estar perdiendo el tiempo de una forma escandalosa.

Escenario y cubo de ‘Curiosity’
‘Curiosity’ se compone de una simple pantalla o escenario blanco en el que flota un enorme cubo tridimensional construido con billones (sí, billones, con «b») de pequeños cubitos distribuidos en varias capas, los que los creadores llaman cubelets. Un único cubo para toda la humanidad, para todos los jugadores que lo descarguen y comiencen a jugar con él. Los participantes deben ir tocando a golpe de tap cada cubelet en cada cara del gran cubo con el objeto de hacerlos desaparecer, dejando al descubierto la capa inferior, repletita, de nuevo, de más y más pequeños cubitos (es necesario eliminar completamente una capa antes de que la siguiente esté disponible para destruir). Como digo, el juego es colaborativo, por lo que los cubos que tú destruyas desaparecerán para los demás jugadores.
El objetivo del entretenimiento es llegar al centro del cubo gigante, demoler el último cubelet y descubrir qué es lo que se encuentra en su interior. ¿Y qué se supone que hay en el interior? Según la empresa desarrolladora, bajo un número no revelado de capas, se encuentra un asombroso descubrimiento esperando ser desvelado, algo así como la revelación desconocida más importante para la humanidad. Al final, lo más probable, es que sea una chorrada de marca mayor. La persona que elimine el último de los cubelets recibirá en su dispositivo un enlace a un vídeo explicando qué hay dentro del cubo. Esta decisión, el hecho de quién ha sido el último el tapear el cubito final, la disponen automáticamente los servidores de la empresa, que son los que llevan un registro de los miles de usuarios que en este y en ese momento destruyen cubos y el orden en el que actúan.
Según va transcurriendo el juego, cada capa tiene un diseño diferente que muestra una pista de lo que el gran cubo contiene. Según se procede a reventar cubos, se van consiguiendo monedas que pueden ser canjeadas por herramientas temporales que mejoran las habilidades del jugador, tales como petardos para desencadenar explosiones, cinceles de hierro o diamante, bombas y otras. Por ahora no existe la posibilidad de comprar monedas con dinero real abonado directamente a la cuenta corriente de 22Cans, pero parece que, en un futuro próximo, va a ser un opción más que probable. Probable y rentable, porque se especula con cantidades de alrededor de los 8,00 $ por 300.000 monedas. Teniendo en cuenta que 300.000 monedas es lo que cuesta un único cincel de hierro y que éste tiene una duración de cinco minutos, ahí está el dinero fácil de la financiación de la empresa. Para que os hagáis una idea, el cincel de diamante cuesta tres mil millones de monedas y dura 22 horas, 22 minutos y 22 segundos.
El afortunado que sea el primero en tapear sobre el último cubo (yo seguro que no seré) y en recibir el secreto a través de su conexión de red, tiene la opción de compartir la información con todo el universo conocido o de reservársela para sí eternamente (ya hay que ser cabrón y se le ocurre esto último). Lo que tiene terminantemente prohibido es canjear el misterio por dinero contante y sonante, ya sea a través de venta privada o vía subasta pública.
El caso es que en sus pocos días de vida, ‘Curiosity’ ha conseguido más de un millón de jugadores rompiendo cubitos. Su autor asegura que desea y espera alcanzar los cien millones, pero el asunto no parece tan claro. La enorme conectividad simultánea que soporta el juego ha llevado a recibir miles de quejas por cuelgues, apagones, pérdidas de monedas, fallos en la sincronización y eternos lag de comunicación.
¿Quién será el último rompedor cubitero? ¿Qué oculta el cubo? ¿Será del dominio público tras el final del juego? ¿Cuándo se acaba esto? ¿Se acaba? Incógnitas que el cubo revelará. O no.
Tráiler del juego
Vale, venga, que sí, ya estamos en Facebook

teknoPLOF! en Facebook
Además, y como se hizo en la época en la que este humilde blog entro en Twitter, allí se puede encontrar desde la más primera primerísima entrada de esta bitácora hasta esta misma, y las que queden por llegar.
Como siempre, espero que el cambio o añadido sea del gusto de todos los frikis feisbuqueros de turno. ¿Para cuándo Google+? Próximamente, quién sabe; pero próximamente puede ser dentro de dos años y medio, que uno va a su ritmo caribeño y no da para más.
Un gran y afectuoso saludo.
teknoPLOF! INTO alt-tab #8

teknoPLOF! INTO alt-tab
Ludum Dare nació en 2002 de la mano de Geoff Howland. Consiste en programar un juego, con todas sus características, en tan sólo 48 horas.
El post, vía alt-tab, aquí: http://alt-tab.com.ar/ludum-dare-desarrollando-diversion-en-un-fin-de-semana/
La delgada línea entre el artista innovador y el puto friqui

Gangnam style
Desde hace bien poco martillea nuestras cabezas un nuevo ritmillo musical al que su autor vino a llamar ‘Gangnam Style‘, un tema del rapero surcoreano conocido como PSY. Esta canción ha roto todos los moldes en lo que a cultura musical internetera se refiere: quinientos millones de visitas en el Tubo y Record Guiness al mayor número de megustas, con nada más y nada menos que 2,6 millones en sólo dos meses (ahora lleva ya más de cuatro millones), superando, vaya usted a saber por qué, al mismísimo ‘Baby’ del Justin Bieber ese de los cojones.
Gangnam style, de PSY
¿Cómo es esto posible? ¿Qué tiene el ‘Gangnam Style’? La primera apreciación tras un visionado inicial del clip es que el coreano este se va a convertir en otro friqui digital al más puro estilo Delfín Hasta el Fin, La Tigresa del Oriente o Wendy Sulca, o, por qué no decirlo, a las joyas nacionales patrias del tipo Tamara o Leonardo Dantés (¿cómo es posible que esta gente tenga entrada en la Wikipedia?). Pero esto no va a ocurrir, y tú lo sabes. Veamos un ejemplo del amigo Delfín y sus compis y comparémoslo con el vídeo anterior. Es una canción alabando las bondades del pueblo israelí, que ya tiene cojones la cosa, aunque no seré yo el que me meta ahora en el conflicto político palestino-israelí, que esta entrada no va de eso.
Israel, Israel, qué potito es Israel
Es evidente que nuestros ojos nos juegan una mala pasada desde el minuto cero. La vista es un sentido bastante básico que se limita a enfocar, captar, recoger y enviar al cerebro, y es este último el que se encarga de dilucidar lo registrado. Nuestro primer impulso, después de aguantar tanto friqui por la Red, es el de etiquetar de carne de galería de los horrores al coreano y a su endemoniado baile, pero no comprendemos por qué coño no podemos parar de mover nuestro pie al son la tonadilla y por qué no se nos borra esa estúpida sonrisa de la boca. ¿Qué clase de magia negra es esta?
La magia no existe más allá de lo que nuestras débiles mentes quieran creer. Park Jae-Sang, el tal caballero que se hace llamar PSY, es un artista surcoreano de 35 años, cantante, rapero, bailarín, compositor y productor. Habla inglés perfectamente, pues residió en Estados Unidos muchos años. Durante ese tiempo, estudió música en la Universidad de Boston y en la Escuela de Música de Berklee. Presume de una carrera musical de más de diez años en la que ha publicado 6 discos. En su país es poco más que un Dios de los videoclips humorísticos y las actuaciones cachondas. Vamos, que no es ningún mindundi, y, aunque parezca que no, eso se nota. Escuchándole hablar en cualquiera de las intervenciones que se pueden encontrar por ahí, desde luego no parece precisamente un retrasado mental al que le han grabado un clip para que la gente se descojone de él. Ni muchísimo menos.
El ritmo de ‘Gangnam Style’ es muy pegadizo, y esto no es casualidad, pues está perfectamente estudiado para que así lo sea. Mezcla diversos estilos que, aunque a su autor no le satisfaga el apelativo, están encuadrados en lo que se conoce como K-Pop, un género musical que incluye música dance electrónica, rap, rock, pop occidental, R&B, y otros, y que se refiere específicamente a la música popular de Corea del Sur. Como sabemos, en estas cuestiones los paises asiáticos van bastante por detrás que el resto del mundo, y lo que a ellos les mola ahora es lo que se llevaba aquí en los ochenta. Sin embargo, esta gente se pone al día cagando chiribitas, porque la cultura hoy, vía Internet, es inmediata y global, así que dan a luz perlas ingeniosas como esta.
Si volvemos sobre la comparanza de los dos vídeos anteriores, es inevitable comentar la calidad del clip de PSY en contraposición con el del avechucho ese del Delfín (and company). Este vídeo no ha costado cuatro pesetas precisamente, las coreografías están muy bien ensayadas, los escenarios, los efectos especiales (muchos humorísticos a posta), el atrezo, las bailarinas y bailarines, el vestuario y etcétera no han costado cuatro pesetas. ¡Hasta las coreanas que aparecen están buenas, hombre! Es un vídeo muy trabajado y muy bien producido. No en vano, el tío es un ídolo en su tierra y, aunque los demás no entendamos ni papa de coreano, el efecto de absorción es máximo. Hoy todas las discotecas, bares y pub del mundo occidental pinchan el ‘Gangnam Style’, y la gente lo baila como si le fuera la vida en ello; es la canción del momento, no hay duda.
Expertos como Luke Seoul, director de artistas y de repertorio de Sony Music Korea, aseguran que su éxito se debe «a su potente vídeo, su singularidad, su ritmo pegadizo y su estilo rompedor». En opinión de Ángel Carrión, jefe de producto de Universal Music Spain (sello que tiene los derechos de PSY en España), que tal combinación resulte irresistible no deja de ser curioso, teniendo en cuenta que casi ningún occidental conoce la lengua coreana. «Posiblemente se trate de la clave del éxito: el factor exótico, el atractivo de lo desconocido. Todo ello unido a que, en el fondo, se trata de una propuesta muy visual«, apunta. Extremadamente visual, apostillaría yo.
‘Gangnam Style’ se ha convertido en todo un movimiento. Decenas de vídeos en Internet parodian el tema, realizan versiones, muestran flahsmob espontáneos y la gente los adora como a dioses indios. La corriente incluso ha superado el férreo control informativo de la vecina Corea del Norte, lo que ha provocado que el Ministerio de Defensa surcoreano se esté planteando la posibilidad de utilizar la cultura K-Pop como instrumento para desmoralizar a las tropas norcoreanas, según el diario conservador Chosun Ilbo (estos a su ritmo y con el rollo de siempre).
Todo un lujo musical que, sí, durará cuatro días, pero que en sus primeros momentos ha hecho que el álbum que lo contiene genere unas ganancias de 360 millones de dólares, amén de otros 760 por su venta en formato MP3. El videoclip, además, ha recaudado ya 40 millones de dólares más, y la decena de firmas que lo han elegido para su publicidad han pagado cada una entre 400 y 500 millones. ¿La efímera gallina de los huevos de oro? Para mí la querría yo, en pepitoria.

