Introducción a la integración de scripts en un motor de juegos

Un lenguaje de “script”, es un lenguaje de programación interpretado por la computadora, es decir, que no requiere compilación.

Actualmente, incluir algún lenguaje de este tipo, en juegos, es muy común por la motivación de otorgar a diseñadores de niveles la posibilidad de agregar comportamientos a objetos o personajes sin necesidad de pasar por un proceso de “compilación” y sin afectar la estabilidad del juego. Además, los lenguajes de scripts suelen ser lenguajes de muy alto nivel, muy productivos en cuanto a generación de código se refiere y con estructuras de datos muy flexibles y fáciles de utilizar.

Por supuesto que realizar una tarea X utilizando un script tomará más tiempo que si hubiese sido codificada en lenguaje C, además es posible que los autores de dichos scripts - no siendo programadores expertos - tampoco realicen las tareas del modo mas eficiente posible.Sin embargo, los scripts suelen ejecutarse en threads de baja prioridad separados del bucle principal, por lo tanto un mal desempeño de los mismos no debería afectar de manera notoria la performance del juego todo. Además, tampoco realizaremos con scripts tareas propias del motor (o al menos no críticas).

Este tutorial expone las características fundamentales de tres exponentes de los lenguajes de scripts utilizados en juegos: Python, Lua y AngelScript. De cada uno de estos lenguajes se detalla como embeberlo en una librería C++ y como realizar la intercomunicación básica con el lenguaje.

Los lenguajes de script

Existen dos alternativas a la hora de incorporar un motor de script dentro de nuestro motor:

Crear nuestro propio lenguaje de scripting: Hace no mucho tiempo era común encontrar juegos, que si utilizaban scripts, implementaban un lenguaje propietario.

Lo positivo de esta estrategia es que las características del script serán exactamente las que necesitemos, la integración con el motor sería mayor y los cambios requeridos al motor de scripting podrían hacerse efectivas en los tiempos que maneje el proyecto.

Lo negativo es que deberemos invertir un esfuerzo no menor en creación de todo el subsistema relacionado a scripting (definición del lenguaje, intérprete y/o compilador JIT, documentación, etc), luego deberemos mantener todo ese subsistema (solucionar bugs, agregar nuevas características, etc). Además sería lógico que no siendo nosotros programadores expertos en la implementación de este tipo de herramientas (ni siendo nuestro motivación principal serlo) muy probablemente los scripts sean mas lentos o requieran más CPU y/o memoria que otros creados y mantenidos por equipos especializados.

Ejemplos de este acercamiento son los juegos Quake (QuakeC), Unreal (UnrealScript), Torque Script (Torque).

Utilizar un motor de scripts ya existente: Utilizar algún motor de scripting ya existente en el mercado es la opción más popular de estos días.

Como positivo podemos destacar que utilizaríamos un lenguaje documentado, del cual es posible encontrar gente capacitada en el mercado, que posee años de uso en la comunidad y que ha sido probado en otros proyectos de manera exitosa (muy posiblemente en juegos).

El lado negativo es que no controlaremos su estado de desarrollo (será imposible - o al menos más difícil - agregar nuevas características y solucionar errores), la integración con nuestro motor podría ser más dificultosa y no quedar tan elegante.

Ejemplos de este acercamiento son los juegos “FreedomForce” (Python) y “Escape from Monkey Island” (Lua). Versiones anteriores del juego Monkey Island utilizaban un motor de scripting propietario llamado SCUMM (Script Creation Utility for Maniac Mansion).

Especificar que alternativa es “la mejor” sería un error, ya que muchos son los factores y variables que entran en juego al momento de tomar una decisión. Sin embargo, en el ámbito del desarrollo independiente, hobbysta o de micro emprendimientos la segunda opción suele ser la más aconsejada ya que el recurso mas escaso de todos es el tiempo.

En este documento veremos como realizar la integración de tres de los lenguajes de scripting más populares en juegos de hoy día:

. Python (http://www.python.org)
. Lua (http://www.lua.org)
. AngelScript (http://www.angelcode.com/angelscript)

Existen, por supuesto, muchos otros lenguajes que es posible integrar como:

. Perl (http://www.perl.com)
. Tcl (http://tcl.sourceforge.net)
. Ruby (http://www.ruby-lang.org)
. Java (http://java.sun.com)
. CSL (http://csl.sourceforge.net)
. CINT (http://root.cern.ch/root/Cint.html)
. Small (http://www.compuphase.com/small.htm)

Pages: 1 2 3 4 5 6

Comments

  1. Novack
    December 1st, 2007 | 2:05

    Hehe, flor de articulo. Todavia no lo termine de leer, pero muy buen tema!

  2. Ni7ram
    December 1st, 2007 | 12:53

    Epa! Crei que tenias abandonada la pagina pero no, estabas haciendo un super articulo. Buenisimo!

  3. December 7th, 2007 | 22:24

    […] Este artículo completa el que publiqué la semana pasada y que puede acceder haciendo click aquí. […]

Leave a reply