Using AS3 project from Haxe as library asset

21.12.2007 6211 7

To do that, we need first make a SWF with the mxmlc compiler.
This SWF will be used as simple swf-library, while compiling with Haxe... but for some dark reasons, this one kills all Haxe initializations ! (no static main() called, almost nothing done...)
So, the trick is to call our Haxe class entry point inside the AS3 code :
AS3Project.as :

package
{
    import flash.display.*; 
    import flash.text.*;
    import flash.utils.getDefinitionByName;
    public class AS3Project extends Sprite
    {
        public static var instance : AS3Project;
    
        public function AS3Project()
        {
            var tf : TextField = new TextField();
            tf.y = 20;
            tf.text = "Hello from AS3Project";
            this.addChild( tf );
            // It call the Main Haxe class from here and set the pointer [instance]
            instance = this;
            var MainHxClass : Class = getDefinitionByName( "HxProject" ) as Class;
                        var instanceMainHx : Object = new MainHxClass();
        }
        
        public function Foo() : void
        {
            var tf : TextField = new TextField();
            tf.y = 40;
            tf.text = "Hello from Foo";
            this.addChild( tf );
        }
    }
}

As we can see we instanciate Haxe project from AS3...
Then let create Haxe extern classes from the AS3 project :

haxe --gen-hx-classes AS3Project.swf

It creates a directory called hxclasses with all classes used into our AS3 project (extern classes are only the headers). So we can acces them from our Haxe project
HxProject.hx :

class HxProject
{
    static function new()
    {
        __initAS3();
        var tf = new flash.text.TextField();
        tf.text = "Hello from Haxe";
        flash.Lib.current.addChild( tf );
        
        AS3Project.instance.Foo();
    }
    
    static function __initAS3()
    {
        var mc = new flash.display.MovieClip();
        AS3Project.instance.parent.addChild( mc );
        flash.Lib.current = mc;
    }
}

We don't need to call any main from Haxe because it's done from AS3.
__initAS3 is here to do a quick Haxe initialization, but some function from Boot like trace will never be available
The compiler commands look like:

haxe HxProject -swf finalPorject.swf -swf-lib AS3Project.swf -swf-version 9 -cp hxclasses

I hope I could delete this post soon, when the process will be improved in Haxe

Commentaires

29.01.2008 à 21:40 daniel

Hi, this sounds very cool but when I execute it, it gives an error on this line:
AS3Project.instance.parent.addChild( mc );
AS3Project variable is not defined.
what might be the cause?
thx, regards
daniel

29.01.2008 à 22:18 Michal

Hi Daniel!
Maybe you forgot generating Haxe headers from the AS3 project like that :
haxe --gen-hx-classes AS3Project.swf
It makes the extern class AS3Project that is used by the HxProject, and the AS3Project is enabled doing that.
Hope it helps,
Michel

30.01.2008 à 00:46 daniel

Hi,
thx, for a hint but I did so. I excute first:

haxe --gen-hx-classes AS3Project.swf

then I use:

haxe HxProject
-cp hxclasses
-swf final.swf
-swf-lib AS3Project.swf
-swf-version 9

to compile the project. When I omit -cp swith it gives an error at the compilation, but when I use it the hexe class cannot access to the flex2 one.
I can execute any method of the haxe class from flex though. Any ideas? Maybe there is some issue with initiation times?
regards
daniel

07.02.2008 à 12:43 daniel

Just in case someone has a similar problem:
it seems haxe sometimes is generating incorrect extern classes when using --gen-hx-classes
A quick fix was to import the class the extern class is extending in the same file as the extern class.
this got rid of some of the runtime errors, but I still couldn't get it to work with haxe 1.17

07.02.2008 à 14:46 Michal

Hi !
I have no much time at the moment, but I'll check what's going on soon

09.02.2008 à 13:39 Michal

Hej !
It's actually a bug in 1.17, Haxe "extern" classes were erasing existing AS3 classes.
It have been fixed in the CVS version, at the time I write that.
Comming soon in next release I hope

10.02.2008 à 12:23 daniel

hey!
ok, good to know! when you have some experience and you have it done previously it must be not so difficult to detect. but when you start it's quite confusing when things that are supposed to work just don't.
thx for all comments.
daniel

Laisser un commentaire

http://
×