0

私はここで少し頭を抱えており、ActionScriptでOOPを使用しています。ビデオストリームをキャプチャするDisplayクラスがあります。カメラを制御するための基本的な停止/記録ボタンのセットを作成しようとしています。thisどうやら私は、クリップを識別して停止することを可能にする変数にアクセスする関数や変数を宣言することはできません。コンパイラ(私はHaxeを使用しています)はエラーをスローします:

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;
  }

  ...
}

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

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

4

2 に答える 2

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
}

また

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

private function __handleStopClick($evt:MouseEvent):void {
    this.stopStream();
}
于 2011-01-14T21:00:08.077 に答える
1

それを行う別の一般的な方法は次のとおりです。

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

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

于 2011-01-14T23:31:47.417 に答える