Probando Haxe

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.

Published by

Ivan Mosquera Paulo

Software Engineer

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s