2011-06-28 12 views
0

私はAS3とHaxeを初めて使っていますが、インスタンス変数の前に必ずつけることなく、最終クラス(Graphics)からメソッドを使用する方法を見つけることを願っていました。代わりに、このような何かのインスタンス変数をプレフィックスせずにGraphics(ex)メソッドを使用

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

[OK]を、ここでは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(); 
} 

マクロはとても楽しいです!

+0

このスニペットの要点はここにあります:https://gist.github.com/1057674 – Waneck

+0

ねえ、ありがとう!これは本当によく見えます。私はHaXeでもこれを利用できるようにしたいと思う人がいると確信しています。今日は後で試してみると、マクロを理解しようとする必要があります。 – user479887

+0

私が正しく理解している場合、 "使用する"例の問題は、HaXeの内部クラスが存在しないため、各クラスのSpriteの別々のインスタンス内で使用されなければならないということでした。このメソッドでは、元の質問(細心の注意)にその詳細を指定したとは思えませんが、複数のクラスで1つのGraphicsインスタンスを使用することができます。 – user479887

1

お試しください。using mixinあなたのSpriteクラスで

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

そして:

例えばクラスGraphicHelperを作成

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

提案していただきありがとうございます。それは大丈夫ですが、すべてのメソッドをラップするその痛みです。私はおそらくこれを使用して終了します。 – user479887

1

'は' キーワードの助けいずれかを使用していますか?

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

本当にいいですね。私はHaXeがこれをサポートしていないことを見て非常に失望しました。[リンク](http://haxe.org/doc/start/flash/as3migration/part1) – user479887

+0

あなたはいつもと同じように動作するマクロを書くことができます。){}。 – Waneck

+0

@Waneck私はそれをどうやってやるのか考え出したが、失敗した。私は、マクロはHaXeの初心者として少し頭がおかしいと思う。 – user479887

関連する問題