NetStream.onStatusをASクラスファイル内で使う


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

4 Comments

  • たぷ wrote:

    FLASHはよくわからんのですが、
    mc.init( filename );

    this.init( filename );
    とは書けないですかね?

    知らんので適当に言ってますが(笑

  • たぷ wrote:

    あー、勘違い。斜め読みして検討違いの発言してますね、反省(笑
    thisは何者なんでしょうねぇ、、。
    MovieClass で無いとすれば、スコープがよくわかりませんね。

  • 110chang wrote:

    FLASHだと、このクラスをムービークリップに関連づけて使うんですが、通常 this はムービークリップ自身のところが、netStream.onStatus イベントハンドラメソッドの中では this は netStream オブジェクトの引数になるようです(たぶん)。考えてみたら変数からのスコープは届かないですよね・・・

  • たぷ wrote:

    憶測なんですが。
    スクリプト処理なので、onStatus のイベントが発生した段階で、this を解釈してるんだと思います。
    なので onStatus を所持してるクラス(つまり netStream)が this になる、って感じなのかなぁ?

    コンパイル言語だと、事前に this はコレね。って結び付けてくれるので、たぶんこういうことは発生しないんですが。
    うーむ、不思議な感じです。
    これは確かにハマりますね、、、。

コメントを残す

Your email is never shared.Required fields are marked *