Haxe + Stage3D + AIR + Intellij IDEA + ANEs combo - is this even possible?

As the topic suggests, I’d like to develop in Haxe using Stage3D and flash/AIR target exclusively. I also need to be able to use different ANEs. I’m using IDEA because: a) it’s awesome and b) I work on a Mac, so no HaxeDevelop for me.

If somebody uses a similar setup, please help me out. I tried it with IDEA 14.0, got Flash target sort of working (it runs in the browser, but outputs the traces in the browser as well - wtf?), but debugging doesn’t work (it says I can only use Flash or C++ targets for debugging, but I’m using the Flash target and it still doesn’t work - wtf?). I’m also not sure (or being more precise: I don’t have a clue) how do I setup AIR stuff, like the app’s descriptor file, how do I run it, etc.

I hope I’ll find answers here :slight_smile:

I personally use FlashDevelop ( windows user) and I’ve just tried haxe in IntelliJ Idea 14.1.4 it works and output trace is in IDE.

1 Like

Would you mind showing (as screenshots perhaps?) how your project settings look like? Do you use AIR SDK? Does debugging work?

Yes, debugging works as you can see from screenshot. There are also config. images. I hope so it will be helpful for you.


1 Like

I see you use FlexSDK, but I’m not sure if you’re able to create AIR apps this way - can you? Also, I don’t want to use OpenFL, I don’t feel like I need it for anything (I’m not going to use any of OpenFL APIs), but maybe it’s a good idea to start with OpenFL and see if things work this way.

Anyway, thanks for your help :slight_smile:

PS. Would you mind trying to run this project: http://old.haxe.org/doc/advanced/flash3d

I got it working with Haxe Compiler setting, but I could only run it in the browser and didn’t get debugging to work (debugger was waiting for the player to connect infinitely).

As you see, I use merged Flex+Air 22 SDK, so it’s possible to create AIR. You can do it from command line or add (manualy wrote script/macros) AIR to compile target list. Currently AIR is not my desired target. I use swf target only for quick debugging.

Well, I have those kind of problems when I worked on AS3 projects. You should check in Idea what is your default FlasPlayer-is debugger or not.

You see, I work with AIR projects every day and never had that problems :confused:

By “merged” you mean you downloaded Flex SDK and copied AIR SDK’s contents onto it? I never used anything like that.

I had a lot of headache with this.

Exactly.

I don’t know do you want to use Starling port of haxe or you want to create your own Stage3D layer for haxe, but maybe Genom2D can be good start point for AIR target because you can compile to swf, AIR and html5.

http://www.genome2d.com/?page_id=87

You can use the Apache Flex SDK Installer to download the latest version of the Flex SDK with AIR included:
https://flex.apache.org/installer.html

The download link there has always worked for me, but right now for some reason it’s not. Hopefully only a temporary thing.

Haxe by itself is very low level, so producing rich multimedia with it is going to take a lot of work. If you’re developing for Stage3D/Flash/AIR, I’d suggest using OpenFL which will provide you with the Flash like API, including access to Stage3D. If you’re familiar with the Flash API, it’s also the path of least resistance.

1 Like

I’m going to use Starling as a SWC and see how it works. I’m really just checking things out, I want to see if it’a really more convenient to work using Haxe. The language itself looks awesome, but the tools, as you can see from this post, give me a real headache.

Just one thing, it does look a bit outdated - AIR 24 beta? I think AIR 25 beta is available already. But I understand this is the safest way of combining Flex and AIR and I shouldn’t experiment with it myself?

Eh, I tried a couple of times, but it always fails on AIR SDK verification:

Is there a way to skip the verification?

I don’t know. I always download and update it through FlashDevelop-Tools->InstallSoftware

I was some kind of installer problem (it’s probably due to AIR 24 beta no longer being beta). I downloaded AIR 23 and it installed correctly.

Also I managed to get it to work! :smiley: It required a bit of “hacking”, but I can now run the app using XML descriptor file and ADL and it works. I can sort of debug as well (I’ll get back here with this problem once if I won’t be able to solve it on my own), so everything looks quite promising so far :slight_smile:

Nice, now I’m wondering: how did you run it :slight_smile:

I’ll post a full description tomorrow, it is a bit complicated, but it currently works like a charm :slight_smile: There are still haxe plugin bugs (e.g. you can’t debug a project using Haxe Compiler setting), but it works with a simple HXML file and a bash script :slight_smile: I still need to test it with a larger project but it looks like it is really fast to run and debug.

2 Likes

The one provided in the FlashDevelop installers is Adobe Flex 4.6, where as the Apache version is Flex 4.15.

That said, it probably doesn’t matter much if you’re not using the Flex components, the only reason I generally use it is a library or ANE requires it. I have found however, I sometimes get slightly different debug information using the Flex+AIR SDK, than just the AIR SDK. This is all when building in native AIR.

OK, so quickly, how I did it :slight_smile:

-cp ../lib
-swf test.swf
-swf-header 800:600:60:FFFFFF
--flash-strict
-swf-version 11
-lib hxsl
-main Test
-debug
-D fdb
  • I created an app descriptor file test-app.xml, which is used by ADL to run a swf file. It looks like this:
<?xml version="1.0" encoding="utf-8" ?>

<!-- Adobe AIR Application Descriptor File Template.
     Specifies parameters for identifying, installing, and launching AIR applications.

     xmlns - The Adobe AIR namespace: http://ns.adobe.com/air/application/17.0.
     The last segment of the namespace specifies the version of the AIR runtime required for this application to run.

     minimumPatchLevel - The minimum patch level of the AIR runtime required to run the application. Optional. -->

<application xmlns="http://ns.adobe.com/air/application/22.0">

    <!-- A universally unique application identifier. Must be unique across all AIR applications.
         Using a reverse DNS-style name as the id is recommended. (Eg. com.example.ExampleApplication.) Required. -->
    <id>com.hxsl.cube</id>

    <!-- Used as the filename for the application. Required. -->
    <filename>Cube</filename>

    <!-- The name that is displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. -->
    <name>Cube</name>

    <!-- A string value of the format <0-999>.<0-999>.<0-999> that represents application version which can be used to check for application upgrade.
         Values can also be 1-part or 2-part. It is not necessary to have a 3-part value.
         An updated version of application must have a versionNumber value higher than the previous version. Required for namespace >= 2.5. -->
    <versionNumber>0.0.1</versionNumber>

    <!-- A string value (such as "v1", "2.5", or "Alpha 1") that represents the version of the application, as it should be shown to users. Optional. -->
    <!--<versionLabel></versionLabel>-->

    <!-- An application version designator (such as "v1", "2.5", or "Alpha 1"). Required for namespace < 2.5. -->
    <!--<version>0.1.0</version>-->

    <!-- Description, displayed in the AIR application installer. May have multiple values for each language. See samples or xsd schema file. Optional. -->
    <!--<description></description>-->

    <!-- Copyright information. Optional -->
    <!--<copyright></copyright>-->

    <!-- Publisher ID. Used if you're updating an application created prior to 1.5.3 -->
    <!--<publisherID></publisherID>-->

    <!-- Identifies the ActionScript extensions used by an application. -->
    <!--<extensions></extensions>-->
    
    <!-- Settings for the application's initial window. Required. -->
    <initialWindow>
        <!-- The main SWF or HTML file of the application. Required. -->
        <content>test.swf</content>

        <!-- The title of the main window. Optional. -->
        <!--<title></title>-->

        <!-- The type of system chrome to use (either "standard" or "none"). Optional. Default standard. -->
        <!--<systemChrome></systemChrome>-->

        <!-- Whether the window is transparent. Only applicable when systemChrome is none. Optional. Default false. -->
        <!--<transparent></transparent>-->

        <!-- Whether the window is initially visible. Optional. Default false. -->
        <visible>true</visible>

        <!-- Whether the user can minimize the window. Optional. Default true. -->
        <!--<minimizable></minimizable>-->

        <!-- Whether the user can maximize the window. Optional. Default true. -->
        <!--<maximizable></maximizable>-->

        <!-- Whether the user can resize the window. Optional. Default true. -->
        <!--<resizable></resizable>-->

        <!-- The window's initial width in pixels. Optional. -->
        <!--<width></width>-->

        <!-- The window's initial height in pixels. Optional. -->
        <!--<height></height>-->

        <!-- The window's initial x position. Optional. -->
        <!--<x></x>-->

        <!-- The window's initial y position. Optional. -->
        <!--<y></y>-->

        <!-- The window's minimum size, specified as a width/height pair in pixels, such as "400 200". Optional. -->
        <!--<minSize></minSize>-->

        <!-- The window's initial maximum size, specified as a width/height pair in pixels, such as "1600 1200". Optional. -->
        <!--<maxSize></maxSize>-->

        <!-- The aspect ratio of the app ("portrait" or "landscape" or "any"). Optional. Mobile only. Default is the natural orientation of the device -->
        <!--<aspectRatio></aspectRatio>-->

        <!-- Whether the app will begin auto-orienting on launch. Optional. Mobile only. Default false -->
        <!--<autoOrients></autoOrients>-->

        <!-- Whether the app launches in full screen. Optional. Mobile only. Default false -->
        <!--<fullScreen></fullScreen>-->

        <!-- The render mode for the app (either auto, cpu, gpu, or direct). Optional. Default auto -->
        <renderMode>direct</renderMode>

        <!-- Whether the default direct mode rendering context allocates storage for depth and stencil buffers.  Optional.  Default false. -->
        <depthAndStencil>true</depthAndStencil>

        <!-- Whether or not to pan when a soft keyboard is raised or lowered (either "pan" or "none").  Optional.  Defaults "pan." -->
        <!--<softKeyboardBehavior></softKeyboardBehavior>-->

        <!-- Display Resolution for the app (either "standard" or "high"). Optional, OSX-only. Default "standard" -->
         <requestedDisplayResolution>high</requestedDisplayResolution>
    </initialWindow>

    <!-- We recommend omitting the supportedProfiles element, which in turn permits your application to be deployed to all devices supported by AIR.
         If you wish to restrict deployment (i.e., to only mobile devices) then add this element and list only the profiles which your application does support. -->
    <!--<supportedProfiles>desktop extendedDesktop mobileDevice extendedMobileDevice</supportedProfiles>-->

    <!-- Languages supported by application. Only these languages can be specified -->
    <!--<supportedLanguages>en de cs es fr it ja ko nl pl pt ru sv tr zh</supportedLanguages>-->
    <supportedLanguages>en</supportedLanguages>

    <!-- The subpath of the standard default installation location to use. Optional. -->
    <!--<installFolder></installFolder>-->

    <!-- The subpath of the Programs menu to use. (Ignored on operating systems without a Programs menu.) Optional. -->
    <!--<programMenuFolder></programMenuFolder>-->

    <!-- The icon the system uses for the application. For at least one resolution, specify the path to a PNG file included in the AIR package. Optional. -->
    <!--<icon>
        <image16x16>Icon-16.png</image16x16>
        <image32x32>Icon-32.png</image32x32>
        <image48x48>Icon-48.png</image48x48>
        <image128x128>Icon-128.png</image128x128>
    </icon>-->
    <!--<icon>
        <image16x16></image16x16>
        <image29x29></image29x29>
        <image32x32></image32x32>
        <image36x36></image36x36>
        <image40x40></image40x40>
        <image48x48></image48x48>
        <image50x50></image50x50>
        <image57x57></image57x57>
        <image58x58></image58x58>
        <image60x60></image60x60>
        <image72x72></image72x72>
        <image76x76></image76x76>
        <image80x80></image80x80>
        <image96x96></image96x96>
        <image100x100></image100x100>
        <image114x114></image114x114>
        <image120x120></image120x120>
        <image128x128></image128x128>
        <image144x144></image144x144>
        <image152x152></image152x152>
        <image512x512></image512x512>
        <image732x412></image732x412>
        <image1024x1024></image1024x1024>
    </icon>-->

    <!-- Whether the application handles the update when a user double-clicks an update version of the AIR file (true),
         or the default AIR application installer handles the update (false). Optional. Default false. -->
    <!--<customUpdateUI></customUpdateUI>-->

    <!-- Whether the application can be launched when the user clicks a link in a web browser. Optional. Default false. -->
    <!--<allowBrowserInvocation></allowBrowserInvocation>-->

    <!-- Listing of file types for which the application can register. Optional. -->
    <!--<fileTypes>-->
    <!-- Defines one file type. Optional. -->
    <!--<fileType>-->
    <!-- The name that the system displays for the registered file type. Required. -->
    <!--<name></name>-->
    <!-- The extension to register. Required. -->
    <!--<extension></extension>-->
    <!-- The description of the file type. Optional. -->
    <!--<description></description>-->
    <!-- The MIME content type. -->
    <!--<contentType></contentType>-->
    <!-- The icon to display for the file type. Optional. -->
    <!--<icon>
        <image16x16></image16x16>
        <image32x32></image32x32>
        <image48x48></image48x48>
        <image128x128></image128x128>
    </icon>-->
    <!--</fileType>-->
    <!--</fileTypes>-->

    <!-- iOS specific capabilities -->
    <!--<iPhone>-->
        <!-- A list of plist key/value pairs to be added to the application Info.plist -->
        <!--<InfoAdditions>-->
            <!--<![CDATA[-->
            <!--<key>UIDeviceFamily</key>-->
            <!--<array>-->
                <!-- iPhone and iPod touch devices -->
                <!--<string>1</string>-->
                <!-- iPad devices -->
                <!--<string>2</string>-->
            <!--</array>-->
            <!--<key>UIStatusBarStyle</key>-->
            <!--<string>UIStatusBarStyleBlackOpaque</string>-->
            <!--<key>UIRequiresPersistentWiFi</key>-->
            <!--<string>YES</string>-->
            <!--]]>-->
        <!--</InfoAdditions>-->

        <!-- A list of plist key/value pairs to be added to the application Entitlements.plist -->
        <!--<Entitlements>
            <![CDATA[
            <key>keychain-access-groups</key>
            <array>
                <string></string>
                <string></string>
            </array>
            ]]>
        </Entitlements>-->

        <!-- Display Resolution for the app (either "standard" or "high"). Optional. Default "standard" -->
        <!--<requestedDisplayResolution>high</requestedDisplayResolution>-->
        <!-- Forcing Render Mode CPU for the devices mentioned. Optional  -->
        <!--<forceCPURenderModeForDevices></forceCPURenderModeForDevices> -->
        <!-- File containing line separated list of external swf paths. These swfs won't be packaged inside the application
        and corresponding stripped swfs will be output in externalStrippedSwfs folder. -->
        <!--<externalSwfs></externalSwfs> -->
    <!--</iPhone>-->

    <!-- Android specific tags that get passed to AndroidManifest.xml file. -->
    <!--<android>-->
        <!--<manifestAdditions>-->
            <!--<![CDATA[-->
            <!--<manifest android:installLocation="auto">-->
                <!--<uses-permission android:name="android.permission.INTERNET"/>-->
                <!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
                <!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
                <!--<uses-permission android:name="android.permission.VIBRATE"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>-->
                <!--<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>-->
                <!--<uses-permission android:name="android.permission.WAKE_LOCK"/>-->
                <!--<uses-permission android:name="android.permission.CAMERA"/>-->
                <!--<uses-permission android:name="android.permission.RECORD_AUDIO"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
                <!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->

                <!--<uses-feature android:required="true" android:name="android.hardware.touchscreen.multitouch"/>-->
                <!--<application android:enabled="true">
                    <activity android:excludeFromRecents="false">
                        <intent-filter>
                            <action android:name="android.intent.action.MAIN"/>
                            <category android:name="android.intent.category.LAUNCHER"/>
                        </intent-filter>
                    </activity>
                </application>-->
            <!--</manifest>-->
            <!--]]>-->
            <!--</manifestAdditions>-->

        <!-- Color depth for the app (either "32bit" or "16bit"). Optional. Default 16bit before namespace 3.0, 32bit after -->
        <!--<colorDepth></colorDepth>-->
        <!-- Indicates if the app contains video or not. Necessary for ordering of video planes with graphics plane, especially in Jellybean - if you app does video this must be set to true - valid values are true or false -->
        <!-- <containsVideo></containsVideo> -->
    <!--</android>-->

</application>

  • I set up my project like so in IDEA:

  • You also need to add all libraries used in the project to Libraries project section in IDEA (I had to add each lib as classes for autocompletion to work properly).

  • For running the project I created a shell script run.sh that I put in the root of the project directory. Script contents:

#!/bin/bash

/Users/booster/Documents/Flex/flexsdk4.15.0air23/bin/adl /Users/booster/Documents/haxe/hxsl/samples/0_cube/test-app.xml

Of course, you need to give it permissions to be executed with: chmod +x run.sh.

Now, you can run the project using the script. Both debugging and running should work without problems:

However, when doing this on a Mac, you’ll get a Terminal window to pop up every time you run the project and you’ll have to close it manually. To work around this problem, I used Platypus with these settings:

And set up the run.app file created this way in place of the run.sh script, like so:

And that’s it :slight_smile: Everything works as expected, except a few minor autocompletion issues (shaders and a couple of small things are marked as syntax errors in the editor). Project can be run and debugged without any issues. And it takes a couple of seconds to launch it, I think it’s faster than with AS3 + AIR.

1 Like

Great, thanks for explanation.:slight_smile: