Блог Mr.Cheater

haXeDevelop - новая IDE под haXe

Будущий сайт проекта - http://haxedevelop.org/ - пока там ничего дельного.
Языки используемые при разработке haXe/air + haXe/neko.
Интерфейс будет написан на AsWing. Можно будет писать плагины, пока не знаю на чем - либо это будут SWF-файлы, либо это будут скрипты на HaxeScript, работающие через какой-то интерфейс.

С июня месяца я официально начинаю разработку кросплатформенной IDE, полностью поддерживающую haXe и все его особенности. Равняться буду в основном на FlashDevelop и FDT, а также Visual Studio.

haXe 2.07 и Air

Мне нужно было закодить приложение на haXe/air с версией haXe 2.07.
При компиляции выпали ошибки.

Error Message:

C:\Program Files\Motion-Twin\haxe/std/flash9/ui/ContextMenu.hx:3: lines 3-13 : F
ield clone should be declared with 'override' since it is inherited from superclass
C:\Program Files\Motion-Twin\haxe/std/flash9/ui/ContextMenu.hx:3: lines 3-13 : F
ield clone overload parent class with different or incomplete type
C:\Program Files\Motion-Twin\haxe/std/flash9/ui/ContextMenu.hx:3: lines 3-13 : f
lash.ui.ContextMenu should be flash.display.NativeMenu
C:\Program Files\Motion-Twin\haxe/std/flash9/ui/ContextMenuItem.hx:3: lines 3-9
: Field clone should be declared with 'override' since it is inherited from supe
rclass
C:\Program Files\Motion-Twin\haxe/std/flash9/ui/ContextMenuItem.hx:3: lines 3-9
: Field clone overload parent class with different or incomplete type

Flash Player - 3d Api "Molehill"

Ссылки:
3D APIs for Adobe Flash Player and Adobe AIR - http://labs.adobe.com/technologies/flashplatformruntimes/incubator/featu...

MAX Racer demo - http://www.youtube.com/watch?v=KcKvS983K8c

Николас Каннасье уже написал статью про использование нового 3d Api в haXe-проектах
http://haxe.org/doc/advanced/flash3d

Полиморфные функции. Библиотека. Версия 1.0

Библиотека реализующая полиморфные функции. Инструкция по установке и использованию:

haxelib install PolymorphFunction

Во FlashDevelop создаем проект, например haXe/Flash:

Заходим Project -> Properies -> Compiler Options -> Libraries
добавляем туда строчку PolymorphFunction

package ;

import flash.Lib;

enum MyEnum {q; w; e;}

class Main
{
        static var myfunc:Dynamic = PolymorphFunction.parse([
                function(a:Int, b:Int) { return a + b; },
                function(a:Int, b:Int, c:Int) { return a + b + c; },
                function(value:String) { return "Hello, " + value + "!"; },
                function(first:Float, two:String) { return Std.string(first) + " -> " + two; },
                function(p1:{ x:Int, y:Int }, p2:{ x:Int, y:Int } ){return { x:p1.x + p2.x, y:p1.y + p2.y };},
                function(arr:Array<Dynamic>) { return "This is Array<Dynamic>"; },

Полиморфные функции. Удобный класс

Я написал класс полиморфных функций и решил поделится. Чтобы понять как задается сигнатура, рекомендую посмотреть http://haxe.ru/node/274

package;
import Type;
/**
 * ...
 * @author Mr.Cheater
 */

 
class PolymorphFunction
{
        static public function create(args:Array<Array<Dynamic>>)
        {
                var hashTable = new Hash<Dynamic>();
                for (i in args) hashTable.set(Std.string(i[0]), i[1]);
                return Reflect.makeVarArgs(function (args:Array<Dynamic>):Dynamic
                {
                        return Reflect.callMethod(null, hashTable.get({
                                var signature = new Array<String>();
                                for (i in args) signature.push(Std.string(Type.typeof(i)));
                                Std.string(signature);
                        }), args);
                });
        }
}

class Main
{
        static var myfunc:Dynamic =  PolymorphFunction.create([
                //The addition of 2 Ints
                [[ValueType.TInt, ValueType.TInt],
                function(a:Int, b:Int)
                {
                        return a + b;
                }]
                ,

Оконное приложение haXe/C++

Используя написанное тут http://haxe.ru/node/210 и тут http://nanoflexer.blogspot.com/2009/09/1.html разобрался с компиляцией под haXe/C++. Прикрутил самописную визуальную библиотеку VistaGUI (очень сырую) и создал пример оконного приложения. Правда компоненты CheckBox и RadioButton сломались, но это не важно, потому что моя VistaGUI и правда очень сырая.
haXe/C++ версия:
http://cs10623.vkontakte.ru/u13476671/116385245/y_33fca01d.jpg
haXe/flash версия:
http://cs10623.vkontakte.ru/u13476671/116385245/y_9e83a1a0.jpg
Исходники:
http://free-files.at.ua/load/0-0-0-25-20

haXe -> C# & Java

http://twitter.com/cwaneck/status/15486381623091200

http://haxe.org/doc/intro
C# and Java targets are coming out soon! (from @cwaneck)

Фишка haXe, основанная на блоках

Фишка, основанная на блоках. Приведу пример.

Например мне нужен класс, в котором будет содержаться массив 10x10 из произвольных Int-ов в диапазоне 0...9. И мне всё равно как он устроен внутри. Никаких лишних функций вроде Array10x10.setup() вызывать я не хочу. Я делаю так:

class Array10x10
{
        static public var data:Array<Array<Int>>;
        static var setup =
        {
                data = new Array<Array<Int>>();
                for (i in 0...10)
                {
                        data[i] = new Array<Int>();
                        for (j in 0...10)
                                data[i][j] = Std.random(10);
                }
        }      
}

class Main
{
        static function main()
        {
                for (i in Array10x10.data) trace(i);
        }
}

Вставка внешнего ресурса (PNG, JPEG, TTF, SWF) в SWF при помощи FlashDevelop

За вставку внешнего ресурса отвечает swfmill.

ШАГ 1

Копируете файл изображения в папку вашего haXe-проекта. Файл появится в меню Project. Щёлкаете правой кнопкой и выбираете Add To Library.

ШАГ 2

Щёлкаете правой кнопкой и выбираете Options....

Убираете галочку Auto-generate ID for movieAttach() и вписываете в соответствующее поле удобное вам название класса/картинки. Если картинка находится в папке, то вы должны указать полный путь до нее folder.subfolder.image.png .

Ставите галочку Embed as a Bitmap instead of Clip.

Различное поведение функции при различных типах аргумента

Предположим нам необходимо различное поведение функции в зависимости от типа получаемого аргумента. Реализуется несколькими способоми. 1ый кажется самый простой для восприятия, а возможно и самый быстрый.

package ;

import flash.display.Shape;

import Type;

class Main
{
        static public function main()
        {
                f(true);
                f(12345);
                f(1.2345);
                f("abcdef");
                f(new Shape());
                f(f);
                f({name: "abcdef" } );
                f(null);
        }
       
        static public function f(value:Dynamic)
        {
                //1) Рабочий вариант на switch
                switch(Std.string(Type.typeof(value)))
                {
                        case "TBool":                           trace("I am Bool");
                        case "TInt":                            trace("I am Int");
                        case "TFloat":                          trace("I am Float");
                        case "TClass([class String])":          trace("I am String");

haXe/js Рисуем с библиотекой raphaelExtern

1) Вот тут нашел ссылку на библиотеку http://lib.haxe.org/p/raphaelExtern.
2) Установил haxelib install raphaelExtern
3) Cоздал haxe->js проект
4) Подключил библиотеку к проекту. Project/Properties/Compliler Options/Libraries/ добавил raphaelExtern
5) Написал код: (См. "How to use it" http://raphaeljs.com/ )

class Main
{
        static function main()
        {
                var paper = new Raphael(10, 50, 320, 200);

                // Creates circle at x = 50, y = 40, with radius 10
                var circle = paper.circle(50, 40, 10);
                // Sets the fill attribute of the circle to red (#f00)
                circle.attr("fill", "#f00");

                // Sets the stroke attribute of the circle to white
                circle.attr("stroke", "#fff");
        }
}

6) Всё скомпилировалось. При запуске через браузер вижу следующее:
"Raphael is not defined
Called from Main::main"

RSS-материал