2011-01-14 5 views
0

私はここで私の頭の中で、OOPを使ってactionscriptにいます。私は、ビデオストリームをキャプチャするDisplayクラスを持っています。私はカメラを制御するための基本的な停止/記録ボタンのセットを作成しようとしています。どうやら私はthisにアクセスする関数や、クリップを特定して止めることができる変数を宣言することはできません。コンパイラ(私はHaxeを使用しています)はエラーを投げます:静的関数とUI要素に問題がありますか?

video/Webcam.hx:96: characters 10-14 : Cannot access this from a static function 

私は間違った方法に近づいているかもしれません。ここにいくつかのコードがあります:

class Webcam extends Display { 

    var nc : flash.net.NetConnection; 
    ... 

    private function addControls(){ 
    var stopIcon = new StopIcon(); 
    var b = new flash.display.MovieClip();  
    b.addChild(stopIcon); 
    b.useHandCursor = true; 
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
     trace(this); 
     this.stopStream() 
    }); 
    b.x = 210; 
    b.y = 20; 
    } 

    ... 
} 

私はAS3にコンパイルするためにHaxeを使用しています。デルタのリストはhttp://haxe.org/doc/flash/as2_compareですが、この問題をカバーしていないようですので、これは私がASと持っている問題です。コンパイラに関連している可能性がありますが、これまでのところHaxeが本当に好きだったので、私は望んでいません。

actionscriptコンパイラがこれらの関数を静的として扱う場合、オブジェクトインスタンスに関連付けられたUI要素を作成するにはどうすればよいですか?

答えて

2

これは、イベント自体を使用せずにMouseEvent.CLICKハンドラで無名関数を使用しているためです。イベントハンドラは引数をとります。これはMouseEvent自体です。だから、あなたは、次のいずれかを実行する必要があります。

b.addEventListener(flash.events.MouseEvent.CLICK, function($evt:MouseEvent) { 
    trace($evt.target.parent); 
    $evt.target.parent.stopStream(); // May require casting, but probably not 
} 

OR

b.addEventListener(flash.events.MouseEvent.CLICK, __handleStopClick); 

private function __handleStopClick($evt:MouseEvent):void { 
    this.stopStream(); 
} 
+0

オブジェクトが関数に渡されることは理にかなっています。両方のメソッドは完全に(キャストなしで)動作しますが、haxeは変数名に$を使用できません。本当にありがとう! – RSG

+0

変数名に$はありません... ack !!!私はそれなしでは生きられませんでした:) – sberry

1

それを行うためのもう一つの一般的な方法は以下の通りです:

private function addControls(){ 
    ... 
    var self = this; 
    b.addEventListener(flash.events.MouseEvent.CLICK,function() { 
    self.stopStream() 
    }); 
    ... 
} 

利点があることです"self"は正確に型付けされ、キャストする必要はありません。このような場合、デフォルトスコープとして「this」を追加して、「自己」トリックを不要にすることを検討しています。

関連する問題