我是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,这似乎很容易。无论如何,感谢阅读。
答案 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();
}
宏非常有趣!