FLVを再生するASクラスファイルを作成していて、ちょっとハマった。

ムービーの初期化をするメソッドinit()を定義して、その中でonStatus関数を定義しても、中からクラスのプロパティにアクセスできない。onStatusでムービーの終わりを検出して再初期化したいのだけど。

onStatus内でthistraceしてみると[ object Object ]となった(これはthisNetStreamオブジェクト自身を参照しているんだと思うけど、正確な事はわかりません・・・)。どうりでスコープが通らないわけだ。

で、どうすれば良いかというと、メソッドのローカル変数にはアクセスできるらしいので、自分自身をinit()のローカル変数に代入して(var mc = this;)おくと、onStatus内で"mc"としてthisにアクセスできる。

そういえば、以前XMLを読み込むクラスを作成しているときXML.onLoadでも同じ問題でハマった。XMLクラスにはXML.loadedというプロパティがあるので、たしか無理矢理XML.onLoadの代わりに使った覚えがあるけど、これも解決できそうです。

クラスにもだいぶ慣れてきましたが、フレームアクションやムービークリップアクションでカンタンにできた事ができなくてよくハマる・・・でも勉強になる。

//MovieClass.as
class MovieClass extends MovieClip
{
  var netConn:NetConnection;
  var netStream:NetStream;
  var myVideo:Video;
  //
  function MovieClass()
  {
    // Constructor
    // NetConnection オブジェクトを初期化
    netConn = new NetConnection();
  }
  //
  function init( filename:String ):Void
  {
    var mc = this;
    // ローカルストリーミング接続を作成する
    netConn.connect( null );
    // NetStream オブジェクトを作成し、onStatus() 関数を定義する
    netStream = new NetStream( netConn );
    netStream.onStatus = function( infoObj )
    {
      if( infoObj.code == "NetStream.Play.Stop" )
      {
        mc.init( filename );
      }
    }
    // NetStream ビデオフィードを Video オブジェクトに割り当てる
    myVideo.attachVideo( netStream );
    // バッファ時間を設定する
    netStream.setBufferTime( 5 );
    // FLV ファイルの再生を開始する
    netStream.play( filename );
    netStream.pause( true );
    netStream.seek( 0 );
  }
  function playVideo():Void
  {
    netStream.pause( false );
  }
  function pauseVideo():Void
  {
    netStream.seek( 0 );
    netStream.pause( true );
  }
  function rewindVideo():Void
  {
    netStream.seek( 0 );
  }
  function stopVideo():Void
  {
    netStream.close();
  }
}