Haxe es el sucesor de MTASC, pero no se limita a tener como objetivo la tecnología flash sino que también genera Javascript, PHP y otros. Además, se acompaña de una máquina virtual, Neko, que le sirve para la ejecución en servidor. Yo personalmente creo que es un proyecto que está intentando abarcar demasiado pero hay varios puntos que me han animado a probarlo:
- Las nuevas funcionalidades y rendimiento mejorado de AVM2 (máquina virtual en las últimas versiones de Flash).
- El lenguaje de Haxe es mejor que ActionScript.
- La posibilidad de portar aplicaciones flash a plataforma nativa fácilmente. Esto se está utilizando por ejemplo para aplicaciones iPhone.
A continuación los pasos necesarios para la instalación y un par de ejemplos de Haxe contra Flash y CPP usando el mismo código:
La instalación en Debian (testing) es sencilla:
apt-get install haxe apt-get install neko
Si no está disponible en tu distribución o se trata de versiones no actualizadas, una buena opción puede ser utilizar el instalador estándar de haxe para Linux y los siguientes pasos seguirán siendo los mismos.
Instalado Haxe y Neko, hacemos:
mkdir -p /usr/lib/haxe/lib/ haxelib setup
Instalaremos hxcpp para hacer alguna prueba.
haxelib install hxcpp
Instalamos el fichero de sintaxis de Haxe para Vim:
wget http://tech.motion-twin.com/zip/haxe.vim && cp haxe.vim /usr/share/vim/vim72/syntax/
Añadimos lo siguiente en nuestro .vimrc
" Haxe
au BufNewFile,BufRead *.hx setf haxe
Ya estamos listos para probar un “hola mundo”:
class Hola {
static function main() {
trace("Hola mundo");
}
Compilamos a swf con
haxe -swf9 salida.swf -main Hola
Podemos abrir el swf directamente con el navegador y deberíamos ver el trace. La función trace de Haxe se dibuja directamente, algo muy práctico la verdad.
Ahora vamos a compilar el mismo fichero a código nativo. Veremos que lo que hace Hxcpp es traducir nuestro fichero fuente en Haxe a código C++. Si falla es probable que sea porque nos falta algún paquete C++, podemos servirnos de apt-file para localizarlos.
Vemos que él mismo se encarga de invocar al compilador C++ con los parámetros adecuados así que nosotros obtenemos el resultado final simplemente con la línea de haxe.
El resultado estará en la carpeta “salida”. Ahí encontraremos nuestro ejecutable ELF (“Hola”) y las carpetas “include”, “obj” y “src”.
./Hola Hola.hx:3: Hola mundo
Echamos un vistazo a las librerías de las que depende nuestro ejecutable:
ldd Hola linux-gate.so.1 => (0xb80d6000) libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb80ad000) libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb80a9000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb7fb6000) libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7f90000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7f65000) libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7e06000) /lib/ld-linux.so.2 (0xb80d7000)
Vemos que no depende de nada extraño, es decir, neko o similar.
Muy bien pero esto se queda un poco pobre tratándose de un simple trace así que vamos a probar algo más. Para ello necesitaremos instalar una librería más. Con Haxe podremos programar contra el API de Flash y generar CPP gracias al wrapper de SDL que implementa NME.
haxelib install neash
Verás que él mismo baja de internet los ficheros necesarios y configura la instalación por lo que al parecer haxelib viene a ser algo parecido a CPAN o PEAR.
El código fuente del nuevo fichero que vamos a probar es el siguiente:
import flash.events.MouseEvent; import flash.events.Event; import flash.display.MovieClip; class Prueba { private var mc: flash.display.MovieClip; private var square: flash.display.MovieClip; function new() { mc = flash.Lib.current; drawSquare(0xAFAFF0,50,50); mc.stage.addEventListener(MouseEvent.MOUSE_DOWN, onPress); } private function drawSquare(pColor:Int,pStartX:Int,pStartY:Int):Void { square = new MovieClip(); square.graphics.beginFill (pColor); square.graphics.moveTo (pStartX,pStartY); square.graphics.lineTo (100,50); square.graphics.lineTo (100,100); square.graphics.lineTo (50,100); square.graphics.endFill (); mc.addChild(square); } static function main() { #if cpp neash.Lib.mOpenGL = true; neash.Lib.Init("Prueba",320,200); neash.Lib.SetBackgroundColour(0xFFFFFF); #end var prueba:Prueba = new Prueba(); #if cpp neash.Lib.ShowFPS(); neash.Lib.Run(); #end } function onPress(event:MouseEvent) { trace("Yepa!!"); square.x += 4; } }
Al igual que antes, primero probamos con flash:
haxe -swf prueba.swf -swf-version 10 -main Prueba https://ivanmosquera.net/wp-content/uploads/2009/11/prueba.swf
Y ahora a código nativo:
haxe -cpp salida_prueba --remap flash:neash -lib neash -main Prueba -cp /usr/lib/haxe/lib/neash/1,0,1/neash/
Vemos que en este caso ha sido necesario directiva de precompilación y decirle a haxe que sustituya las ocurrencias de flash por neash.
Por ahora la sensación que me da es que Haxe como plataforma open source para Flash ya es estable, pudiendo sustituir a MTASC perfectamente pero en cuanto a CPP la cosa puede estar demasiado verde como para cosas serias.