Archive for 'Programación'

Unity: Desarrollo de juegos 3D en Macs

Unity Logo

Unity ya ha hecho algo de ruido dentro de la comunidad desarrolladora de juegos, principalmente por ser una herramienta basada en Macs, una plataforma que tradicionalmente ha desfavorecido el desarrollo de juegos.

Unity, sin embargo, ha tomado una aproximación bastante acertada al desarrollo de un juego. Es un editor predominantemente visual, incluyendo librerías físicas (provistas por PhysX), librerías gráficas que soportan modelos 3D de populares paquetes, y scripting basado en Mono, una implementación Open Source de .NET. Lo último, en cristiano, es que se pueden hacer scripts en el lenguaje de tu preferencia, que Unity lo va a entender. Promete también acceso fácil a los shaders.

¿Alguno con Mac le ha dedicado algún tiempo a probar este programa?

¿Cómo aprender un lenguaje de programación? Haciendo un juego

Aprender un nuevo lenguaje de programación es una tarea que constantemente se hace durante la carrera de un programador profesional. Y a pesar de que esto es así, esta tarea nunca es repetitiva. Todos los lenguajes tienen pequeñas diferencias entre sí que pueden representar un reto para el programador, o volverlo loco. Y es que la mayoría de las situaciones en las que uno aprende un lenguaje se deben a una obligación, ya sea académica o laboral, y en etapas donde la urgencia es grande y las posibilidades de tomárselo con calma son pocas.

Sin embargo, les tengo una estrategia para aprender un lenguaje de programación: hacer un juego. Sólo es necesario un poco de tiempo extra. Un juego tiene algunas complicaciones extra que las aplicaciones comunes no tienen, por lo que esta es una estrategia similar a la que haría un deportista: entrenar más allá de lo necesario para poder enfrentar otros retos sin tanto esfuerzo. Y lo que propongo es más divertido que hacer pesas.

Les voy a presentar 3 casos donde he aplicado esta metodología, con un buen grado de éxito y muchísima diversión. Esto, por supuesto, es mi caso particular, es decir, los resultados pueden variar. Comencemos.

Cómo aprendí Java

Cuando terminé mi primer curso universitario directamente relacionado con programación, donde tuve que aprender a utilizar Java, me quedé con las ganas de saber más sobre este lenguaje. Siempre había tenido interés por “hacer juegos”, un área que para mí en ese momento era todavía muy difusa. El hecho es que este interés me llevó a hacer mi primer juego hecho “con seriedad”. El resultado fue un juego de UNO muy sencillo al que le fui agregando algunas cosas, y terminó con algunas reglas que aplicaba cuando hacía partidas con los amigos.

UNO for Java screenshot
Parte de un screenshot del juego.

Cuando terminé de hacer este juego, había aprendido muchísimo sobre la librería Swing de interfaces gráficas, y comencé a experimentar de primera mano sobre lo que hay que hacer para implementar un juego: estructuras de datos y algoritmos.

Cómo aprendí C

Tiempo después, por una serie de eventos desafortunados, me encontré en una situación en la que no podía ver clases, así que disponía de mucho tiempo libre. A mis manos llegó un excelente tutorial de cómo hacer raycasting, la técnica que utiliza Wolfenstein 3D para hacer sus gráficos. Debido a que pronto en otro curso iba a utilizar el lenguaje C, pues decidí aprenderlo haciendo este tutorial, y escogí la librería Allegro para las rutinas gráficas.

El proceso fue divertidísimo, y el resultado fue haber aprendido a programar en C, sin pensar en orientación a objetos. Concluí que Allegro es una buena librería para implementar juegos. Cuando comencé el curso donde requería usar este lenguaje, ya tenía un dominio relativamente decente de los apuntadores y otras cosas que lo enredan a uno cuando está aprendiéndolo.

Raycaster screenshot
Screenshot del raycast cuando lo estaba trabajando.

Cómo aprendí Python

El cómo estoy aprendiendo Python lo han presenciado ustedes a través de CuteGodChigüire, el juego tipo God que he estado haciendo y del que he hecho una crónica de desarrollo. A diferencia de los otros dos, ustedes tienen la ventraja de que pueden leer cómo se ha implementado el juego paso a paso.

Las Complicaciones

Como dije en un principio, los juegos presentan complicaciones que otras aplicaciones no tienen. Cuando no se sabe cómo implementarlo, un juego puede parecer algo impenetrable. Lo cierto es que un juego comienza como algo sencillo: un conjunto de estructuras de datos y un algoritmo que las actualiza constantemente, un algoritmo que implica un ciclo infinito que chequea al final si la meta del juego se cumplió. Agregar reglas de juego e implementar efectos como animaciones, transiciones y otras cosas van complicando la tarea. Lo bueno de esta metodología es que uno puede parar en el momento que uno siente que ya está en capacidad de poder escribir en el lenguaje.

La otra complicación puede ser ubicar una librería gráfica que facilite la tarea de programación. En la época que aprendí Java no habían muchas opciones de librerías, pero hoy en día sí las hay. En C/C++ están SDL o Allegro, y existen una variedad de bindings de estas librerías a otros lenguajes, por lo que hay excusa para aprender estos lenguajes también.

En este momento les dejo estas preguntas: ¿vale la pena hacer un juego para aprender un lenguaje de programación?, ¿lo has hecho y te ha beneficiado?, ¿ves otras complicaciones que no he cubierto aquí?, ¿estoy diciendo una loquera?. Dejo este espacio abierto para comentar esta propuesta.

Accediendo a los subpixels con Pygame mediante SubPixelSurface

Una de las limitaciones que posee Pygame, una librería para desarrollar juegos con Python, a la hora de dibujar sprites en pantalla es que sólo es posible hacerlo en coordenadas enteras. Esto, para algunos sprites pequeños, ej. partículas, es un salto demasiado grande y se ve feo en la pantalla. Will McGugan, de Where there is a Will, escribió un pequeño paquete que toma una superficie (un Surface) de Python y lo transforma en una superficie capaz de dibujar objetos con coordenadas fraccionales, justo como lo harías con OpenGL u otra librería 3D. Al hacer este procedimiento con el código de Will, el objeto mismo hace el cálculo de los subpíxeles, y combinado con la animación que le des al objeto el resultado es un movimiento muy suave, como lo demuestra un GIF de ejemplo a continuación:

Will McGugan SubPixelSurface DemonstrationWill McGugan SubPixelSurface DemonstrationWill McGugan SubPixelSurface DemonstrationWill McGugan SubPixelSurface DemonstrationWill McGugan SubPixelSurface Demonstration

Las pelotas de encima están dibujadas mediante sub-pixeles, y las pelotas de abajo con coordenadas enteras. La diferencia en la suavidad de movimiento es notable. Requiere el módulo Numpy para poder funcionar. También tiene la desventaja que el precálculo hecho a cada superficie requiere una buena cantidad de memoria, específicamente 9 veces más que una superficie normal para el nivel por defecto de precisión, por lo que es manejable para superficies relativamente pequeñas.