Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Fundamentos en la programación de videojuegos

Iniciado por ecarisio, 16 de Septiembre de 2014, 07:16:54 AM

« anterior - próximo »

ecarisio

http://www.micromania.es/taller/fundamentos-en-la-programacion-de-videojuegos

La programación es la herramienta que nos permite dictarle a un ordenador las instrucciones que definen las reglas de un videojuego, la interacción y sus respuestas. ¡Aprender un lenguaje de programación válido es crucial para un equipo de desarrollo en cualquier proyecto!

Descubre los fundamentos de los lenguajes de programación.

Para alguien ajeno al universo de la programación de computadores, el proceso mediante el cual indicamos a una máquina una serie de tareas a realizar puede parecer cosa de magia, un arcano insondable difícil de abordar. Sin embargo, se trata esencialmente de comunicarse con fluidez y precisión en unos términos y gramática que el ordenador pueda comprender e interpretar. En definitiva, un lenguaje. En este artículo veremos los fundamentos de la programación de computadores, los lenguajes de programación que se han distinguido como más útiles y poderosos, junto con los paradigmas que más se han estandarizado en el desarrollo de videojuegos.



Lenguajes y paradigmas

Como probablemente muchos sabrán, toda la información que un ordenador es capaz de manejar fluye a través de corrientes eléctricas por unos circuitos, que según su voltaje, representarán unos o ceros. Cómo un programador puede dictarle a una máquina –que sólo entiende estas sucesiones de unos y ceros– que realice una determinada tarea es, en realidad, algo elemental. En este taller de U-tad nos centramos en los principales paradigmas de los lenguajes de programación que se han utilizado a lo largo de la Historia para desarrollar videojuegos, los principios fundamentales de cada uno de ellos, y cómo han ido evolucionando con el paso de los años.



Código máquina y ensamblador

El lenguaje denominado código máquina contiene una serie de instrucciones y datos que son directamente interpretables por el procesador de un ordenador. Los procesadores disponen de instrucciones, como por ejemplo devolver el resultado de sumar dos valores. Si el procesador recibe la secuencia de unos y ceros que se corresponde con esta instrucción, entonces interpretará los siguientes unos y ceros como los valores a sumar. La cuestión que nos queda es, ¿cómo podríamos representar un determinado valor decimal, por ejemplo el valor "9″, con esta serie de unos y ceros llamada código binario?

Lo que se hace es interpretar cada bit (cada "1″ o "0″) como una determinada potencia de dos –en función del orden en que se leerá– y luego se suman todas estas potencias. Si estuviésemos manejando un código binario de 4 bits (es decir, cada valor está compuesto de cuatro dígitos de unos y ceros), el valor máximo que se puede representar es:

23 + 22 + 21 + 20 = ¿...?

En efecto, el valor que resulta es 15 en su forma decimal. Para representar un determinado valor, se suman las potencias de dos correspondientes a las posiciones donde hay unos en el valor que recibe el procesador. Por ejemplo, el valor 9 se representaría de la siguiente forma: 1001

Es decir, 23 + 0 + 0 + 20 = 8 + 1 = 9.

¿Imaginas qué difícil sería decir las cosas en código binario? Los lenguajes de programación han permitido una comunicación viable y eficaz.

Lo que ocurre es que, para un programador, subdividir la tarea que quiere que el ordenador realice en instrucciones y datos introducid0s en código binario es un engorro descomunal propenso a errores. Ante la necesidad de agilizar la tarea apareció el lenguaje ensamblador. El ensamblador nos permite escribir las instrucciones y datos como texto, que luego se traduce a código máquina mediante una herramienta. Por ejemplo, si en ensamblador tenemos una instrucción llamada "ADD" (addition), será traducida a la secuencia de ceros y unos que representa la instrucción "suma".



El código máquina no resultaba un medio ágil; para programar fue necesario crear lenguajes de programación que permitieran traducir instrucciones a código máquina desde un nivel superior

El ensamblador, al permitirnos codificar directamente las instrucciones del procesador, es increíblemente rápido, y fue utilizado como el lenguaje de programación para videojuegos por excelencia durante la época de los 8 y los 16 bits (ZX Spectrum, NES, Super NES, etc.).



La aparición del BASIC

El BASIC es toda una familia de lenguajes de programación orientada a fines académicos por su facilidad de uso. El primer BASIC surgió a mediados de los años 60, en la versión que terminó por llamarse Darmouth BASIC, pero su uso se extendió con los ordenadores personales de finales de los 70 y principios de los 80. La mayoría de aquellos aparatos incluyeron una versión del lenguaje BASIC para que los usuarios domésticos pudiesen realizar programas sencillos sin conocimientos de programación. Como se dice, una de sus características es su extremada sencillez. Un programa sencillo podría ser el siguiente:

10 PRINT "HOLA MUNDO"

20 GOTO 10

La primera instrucción imprime en una línea de la pantalla el mensaje "HOLA MUNDO", y la segunda instrucción vuelve a la línea numerada como 10. El resultado es un programa que imprime el mensaje en pantalla continuamente, sin finalizar nunca. El utilizar números para identificar cada instrucción fue algo muy extendido en los diversos lenguajes BASIC de la época.

Pese a su sencillez, el BASIC no fue casi utilizado en el sector profesional debido esencialmente a su mayor lentitud frente al código ensamblador. Mientras que en ensamblador nuestro programa se traduce al código máquina correspondiente, en BASIC lo habitual era que nuestro programa no fuese ejecutado directamente por el procesador, sino por otro programa llamado intérprete. La tarea del intérprete es la de ir leyendo cada línea del fichero –o dirección de memoria– donde está nuestro programa, generar las instrucciones de código máquina equivalente, y pasárselas una a una al procesador en forma binaria. Evidentemente este proceso ralentiza la ejecución de un programa.

Hoy en día siguen existiendo dialectos avanzados inspirados por BASIC, como Visual Basic .NET, BlitzMax, o Monkey X, que mantienen del BASIC su sencillez, aunque incorporan paradigmas de programación de otros lenguajes más avanzados.



La revolución del C

La creación del Lenguaje C supuso todo un hito en la historia de los lenguajes de programación. Fue creado en 1972 en los laboratorios AT&T Bell, con el fin de usarlo para implementar el sistema operativo Unix. C es un lenguaje altamente eficiente, que se popularizó como lenguaje para el desarrollo de videojuegos durante la década de los 90. Frente al ensamblador, C se basa en el paradigma de la programación estructurada, que permite escribir un código mucho más ordenado. Básicamente, C divide el código en unos componentes llamados "funciones" que pueden ser utilizados en distintos puntos del programa.

El éxito del lenguaje C motivó su evolución, dando lugar a la aparición del llamado C++. Este nuevo código se popularizó como lenguaje de programación de videojuegos durante la década pasada, introduciendo un nuevo paradigma: la Programación orientada a objetos.



Programación Orientada a Objetos: C++ y Java

Visual C++ es uno de los entornos de programación en lenguaje C++ más utilizados. Se contempla en todas las herramientas de desarrollo de videojuegos.

De la misma forma que en C un programa se subdividía en funciones que realizan una tarea específica, este nuevo paradigma segmenta un programa en objetos, que serán cada una de las entidades de nuestro programa. En C++ cada objeto tiene sus propios datos y operaciones que permite realizar. Por ejemplo, habría un objeto para cada enemigo, otro para el jugador, otro para la cámara que visualiza la escena, etc.

El comportamiento de cada objeto se define en lo que se ha dado en llamar clase. A partir de una clase se pueden crear objetos. Es decir, el programador puede crear una clase "Enemy" que define el comportamiento de un enemigo, y luego crear tantos objetos Enemy como sea necesario a partir de la clase. Este paradigma de programación es el más utilizado hoy en día –no sólo en el mundo de los videojuegos– y C++ sigue siendo un lenguaje esencial para la industria.



Conocer el lenguaje C++ resulta crucial para afrontar el desarrollo de un videojuego en la actualidad



Herramientas de desarrollo asequibles junto con el uso de lenguajes C++, C# o Java –parecidos entre sí– han dado lugar al reciente estallido de juegos indie.

Siguiendo con el impacto del paradigma que ha supuesto C++, resulta ineludible mencionar el Lenguaje Java. Con una sintaxis inspirada en la de C++, Java resulta, sin embargo, un lenguaje mucho más sencillo. Por ejemplo, libera la memoria de objetos que ya no son necesarios en una escena automáticamente. El objetivo original de este lenguaje era que las aplicaciones programadas en Java pudiesen correr en cualquier dispositivo que tuviese una máquina virtual para este lenguaje. Una máquina virtual es, básicamente, un intérprete.

El desarrollo de juegos en Java ha llevado infinidad de juegos a móviles, incluso de géneros tan de PC como la estrategia, como con Demise of Nations.

Durante estos últimos años, Java ha sido extensamente utilizado como lenguaje de programación en dispositivos móviles y hoy es especialmente popular en el desarrollo de aplicaciones para la plataforma Android. A pesar de que nunca ha sido muy utilizado para desarrollar juegos en PC o Mac, Android cuenta con honrosos ejemplos de su potencial, como Minecraft. Aunque los juegos en Java no pueden competir (aún) con los desarrollos para PC en sofisticación técnica, cuentan con entornos 3D bastante realistas.

El lenguaje Java no es muy utilizado en PC, pero cuenta con éxitos de juegos que han llegado a los ordenadores. El caso más sonado es el de Minecraft.


Entornos de creación de videojuegos: Unity

Dentro del mundo amateur siempre han existido entornos que simplifican la creación de videojuegos. Algunos casos conocidos son el AMOS en Amiga, Div Games Studio en MS-DOS, o GameMaker en Windows. Estas soluciones pretenden simplificar el desarrollo de un juego, minimizando la necesidad de programar y ofreciendo un entorno visual desde el que diseñar y editar todos los elementos (gráficos, sonido, interacción, etc.).

GameMaker es uno de los entornos de desarrollo para aficionados más conocidos. Lo tienes en Steam, pero tampoco te libra de tener que programar.



Los juegos para móviles –como NFS Most Wanted– son cada vez más realistas gracias a la evolución de los lenguajes y las herramientas de desarrollo.

En el ámbito profesional, este tipo de entornos de desarrollo han existido dentro del concepto de motores gráficos, que pese a permitir su uso con versiones de aprendizaje limitan su explotación comercial requiriendo el pago de costosas licencias. El motor de Quake es uno de los ejemplos más conocidos, pero más recientemente, los UDK (Unreal) y Cryengine también están siendo muy utilizados.

El entorno Unity permite usar las mismas herramientas y lenguajes para juegos en diversas plataformas. Breach & Clear es de lo más espectacular para Android e iOS.

Otro hito importante ha sido la llegada de Unity, un motor multiplataforma que ofrece una versión comercial de bajo coste. Gracias a que ofrece soporte para un gran número de plataformas móviles, muchos estudios independientes han recurrido a Unity para dar vida a sus creaciones. Otras compañías, como Havok, se han unido al carro con casos como Project Anarchy, una herramienta de creación de juegos similar a Unity. En definitiva, nunca antes los desarrolladores han dispuesto de tantas herramientas ni tan potentes para desarrollar videojuegos. Además, si te decides en este campo, puedes partir de muchos programas gratuitos con los que practicar y adentrarse en el aprendizaje de la programación. ¡Es un gran momento para animarse a desarrollar juegos!




ESTRUCTURA DE PROGRAMACIÓN

En el paradigma de programación actual, el flujo de ejecución del programa es controlado mediante tres tipos de estructura: de iteración, de selección y de secuencia. La iteración permite pasar por una serie de instrucciones varias veces, mientras se cumpla una determinada condición. La selección permite ejecutar un bloque de instrucciones bajo tal condición. La secuencia implica que un bloque de instrucciones debe ser ejecutado en orden.

Las estructuras de iteración, selección y secuencia controlan todas las funciones que se ejecutan en un juego programado en lenguaje C.

Este paradigma permitió eliminar el uso de "GOTO", que se consideraba peligroso, ya que permitía realizar saltos de un punto cualquiera del programa a otro. La programación estructurada impone una jerarquía en la definición de estructuras. Si dentro de una estructura se abre otra, ésta última debe ser "cerrada" antes de que se cierre la estructura que la contiene. Cuando saltamos de un punto a otro del programa, siempre se respetará esta jerarquía de estructuras. Por ejemplo, al invocar a una función, saltaremos al bloque de código de la misma, se ejecutará respetando estos principios de iteración, selección, y secuencia, y volverá exactamente al punto donde se invocó.

Juegos actuales tan diferentes como Diablo III o el plataformas Mark of the Ninja comparten un mismo tipo de programación estructurada en "iteración, selección y secuencia". Mismos ingredientes, pero distinta fórmula.
PROGRAMACIÓN ORIENTADA A OBJETOS

La programación orientada a objetos se caracteriza por tres propiedades: encapsulación, polimorfismo y herencia.

    La encapsulación se refiere a que cada objeto encapsula o contiene todos sus datos y las operaciones que puede realizar.
    El polimorfismo es un concepto más abstracto y encierra una mayor dificultad de comprensión. Básicamente se refiere a que cuando realizamos una operación sobre un objeto, el resultado de dicha operación dependerá de la clase a la que pertenezca dicho objeto.
    La herencia determina una jerarquía y el modo en que los objetos interactúan entre sí, en función de su clase. Al definir una clase previamente, se determina el comportamiento de uno o varios objetos. La herencia indica que los objetos de una clase pueden heredar la funcionalidad de otra. Esto está relacionado con el polimorfismo, ya que es posible que una clase redefina operaciones de la clase heredada (en la que se basa) y, en tiempo de ejecución, se decidirá qué versión de la operación se utilizará.

La programación orientada a objetos permite la elaboración de los sofisticados juegos actuales sujetos a múltiples factores de interacción, física, gráficos, IA, etc.

Los enemigos a los que te enfrentas en un juego pueden compartir gran parte del código que rige su comportamiento (clase) y diferenciarse cuando entran en juego diversos factores como el poliformismo, o la herencia. Todos los objetos que puedes ver en un juego –y muchos más que no ves– están sujetos a unas normas de composición definidas en el código. Contienen otros y son contenidos en otros.


EL ENTORNO UNITY

Unity es un entorno de creación de videojuegos desarrollado por Unity Technologies, una compañía afincada en Dinamarca. Inicialmente estaba orientado al desarrollo de juegos en 3D, aunque desde la versión 4.3 soporta también la creación de juegos en 2D.

Como Unity permite trabajar sobre un entorno visual, podemos ver siempre el aspecto del juego y todos sus elementos en tiempo real.

Contiene un entorno visual desde el cual, arrastrando objetos con el ratón, podemos definir el escenario de juego. Las propiedades visuales, de colisiones y físicas de los elementos se editan desde el propio entorno, y la lógica de cada uno de ellos se puede programar utilizando los lenguajes C#, un lenguaje basado  en C++ creado por Microsoft; JavaScript, un sencillo lenguaje muy utilizado en la web hoy en día; o Boo, que es un lenguaje orientado a objetos inspirado, a su vez, en la sintaxis del lenguaje Python.




Javier-San-Juan-Cervera-U-tad-210x300.jpEl Experto Javier San Juan Cervera

Codirector Máster en Programación de videojuegos U-tad: http://www.u-tadpostgrados.com/programacion-videojuegos/?utm_campaign=EM&utm_content=articulo

    Javier San Juan Cervera ha trabajado como programador de videojuegos en los estudios Digital Jokers y Future World Games, así como desarrollador freelance de aplicaciones para plataformas iOS. También fue investigador en materia de Inteligencia Artificial en la Universidad Politécnica de Madrid.

    En la actualidad es profesor en U-tad, y Codirector del Máster en Programación de videojuegos en ese mismo centro junto a Jon Beltrán de Heredia, Fundador y CEO de Mouin.
http://www.u-tadpostgrados.com/programacion-videojuegos/?utm_campaign=EM&utm_content=articulo

Lustrike

Muy buen post, de verdad. Resume todo bastante bien para el que no conozca demasiado la industria.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.