使用Graphics(for ex)方法而不为实例变量添加前缀

时间:2011-06-28 22:04:36

标签: flash actionscript-3 haxe

我是AS3和Haxe的新手,但我希望找到一种方法来使用最终类(Graphics)中的方法,而不必总是为实例变量添加前缀。

而不是像这样:

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

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

我希望得到的东西就像processing.org一样,但我想这里有很多便利来自预处理。我查看了advanced types上的Haxe参考,但到目前为止我还没有做任何工作。这可能是不可能的,因为图形是最终的,但我认为这不会有问题。如果我可以扩展Graphics,这似乎很容易。无论如何,感谢阅读。

3 个答案:

答案 0 :(得分:1)

使用可以尝试using 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);
    }
}

答案 1 :(得分:1)

使用'with'关键字是否有帮助?

var someSprite:Sprite = new Sprite();
with( someSprite.graphics )
{
    beginFill(0xC0FFEE, 1);
    drawRect( -10, -10, 20, 20 );
    endFill();
}

答案 2 :(得分:0)

好的,这是在Haxe上实现非常简单的with() {...}仿真的代码:

//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();
}

宏非常有趣!