FLVを再生するASクラスファイルを作成していて、ちょっとハマった。
ムービーの初期化をするメソッドinit()
を定義して、その中でonStatus
関数を定義しても、中からクラスのプロパティにアクセスできない。onStatus
でムービーの終わりを検出して再初期化したいのだけど。
onStatus
内でthis
をtrace
してみると[ object Object ]
となった(これはthis
がNetStream
オブジェクト自身を参照しているんだと思うけど、正確な事はわかりません・・・)。どうりでスコープが通らないわけだ。
で、どうすれば良いかというと、メソッドのローカル変数にはアクセスできるらしいので、自分自身を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();
}
}