использовать методы Graphics (для ex) без префикса переменной экземпляра - PullRequest
0 голосов
/ 29 июня 2011

Я новичок в AS3 и Haxe, но надеялся найти способ использовать методы из конечного класса (Graphics), не всегда добавляя префикс переменной экземпляра.

Вместо чего-то вроде этого:

var gr:Graphics = flash.Lib.current.graphics;

gr.clear();
gr.beginFill(0xffffff, 1);
gr.drawRect(0,0,400,400);

Я надеялся получить что-то, что работает как processing.org, но я предполагаю, что большая часть удобства заключается в предварительной обработке.Я посмотрел ссылку на Haxe для продвинутых типов , но до сих пор не смог заставить что-либо работать.Это, вероятно, невозможно, так как Графика окончательная, но я подумал, что не мешало бы спросить.Кажется, было бы легко, если бы я мог расширить Графику.В любом случае, спасибо за чтение.

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Помогает ли использование ключевого слова with?

var someSprite:Sprite = new Sprite();
with( someSprite.graphics )
{
    beginFill(0xC0FFEE, 1);
    drawRect( -10, -10, 20, 20 );
    endFill();
}
1 голос
/ 29 июня 2011

Использование можно попробовать с помощью mixin .

Например, создать класс GraphicHelper:

class GraphicHelper {
    inline public static function drawRect(sp:Sprite, x:Float, y:Float, w:Float, h:Float) {
        sp.graphics.drawRect(x,y,w,h);
    }
}

А потом в вашем классе Sprite:

using GraphicHelper;

class Square extends flash.display.Sprite {
    public function new():Void {
        super();
        drawRect(0,0,10,10); //this is GraphicHelper.drawRect(this,0,0,10,10); and since it is inline, actually is this.graphics.drawRect(0,0,10,10);
    }
}
0 голосов
/ 01 июля 2011

Хорошо, вот код для реализации очень простой with() {...} эмуляции на Haxe:

//simple.hx
class Simple 
{

    @:macro public static function with(subject:Expr, block:Expr)
    {
        return with_impl(subject, block);
    }

    #if macro
    static function with_impl(subject:Expr, block:Expr)
    {
        function mk(e, pos) return { expr:e, pos:pos };

        //this is the main function here. It's going to find a variable  the expression so it uses our subject
        function changeIdent(identExpr:Expr, changeExpr)
        {
            return switch(identExpr.expr)
            {
                case EConst(c):
                switch(c)
                {
                    case CIdent(s):
                    mk(EField(changeExpr, s), identExpr.pos);

                    default:
                    identExpr;
                }

                case EField(e, f):
                mk(EField(changeIdent(e, changeExpr), f), identExpr.pos);

                case EType(e, f):
                mk(EType(changeIdent(e, changeExpr), f), identExpr.pos);

                default: //fallba
                identExpr;
            }
        }

        return switch(block.expr)
        {
            case EBlock(exprs):
            var newblock = [];
            for (statement in exprs)
            {
                switch(statement.expr)
                {
                    case ECall(e, params):
                    newblock.push(mk(ECall(changeIdent(e, subject), params), statement.pos));
                    default:
                    newblock.push(statement);
                }
            }

            mk(EBlock(newblock), block.pos);

            case EDisplay(e, iscall):
            mk(EDisplay(with_impl(subject, e), iscall), block.pos);

            default:
            changeIdent(block, subject);
        }
    }
    #end
}

вы используете это так:

//Main.hx
class Main 
{

    static function main() 
    {
        Simple.with (Lib.current.graphics,
        {
            beginFill(0xC0FFEE, 1);
            drawRect( -10, -10, 20, 20 );
            endFill();
        });
    }

}

Вместо изменения области видимости, он будет искать выражения вызова и просто добавлять первый аргумент функции (субъекта) в каждое выражение. Таким образом, приведенный выше код эквивалентен:

{
    Lib.current.graphics.beginFill(0xC0FFEE, 1);
    Lib.current.graphics.drawRect( -10, -10, 20, 20 );
    Lib.current.graphics.endFill();
}

макросы - это так весело!

...