2009.09.06

loaderで読み込んだswf(AVM1Movie)の再生制御

詰まったのでメモ。

やりたいこと

あるところにAIRアプリ"Player"とswfファイル"Movie.swf"がありました。
"Player"で"Movie.swf"を読み込んで、再生する。
"Player"上でクリックすると"Movie.swf"のフレームを1つ進め、
右クリックすると"Movie.swf"のフレームを1つ戻したい。

問題と解決策

swfには、

  • AVM1Movie(AS2orAS1で書かれたFlash)
  • AVM2Movie(AS3で書かれたFlash)

の2種類がある。
"Movie.swf"がAVM2Movieの時は、"Player"で

Actionscript:
  1. var loader:Loader = new Loader();
  2. loader.load(new URLRequest("Movie.swf") );
  3. addChild(loader);
  4. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
  5. MovieClip(loader.content).gotoAndStop("hoge");
  6. });

ってすれば簡単に上記のやりたいことが達成できる。たぶん。

でも、"Movie.swf"がAVM1Movieの時はそうはいかない。
でもでも、ForcibleLoaderをつかえばできるよ!

Actionscript:
  1. var loader:Loader = Loader(addChild(new Loader()));
  2. var fLoader:ForcibleLoader = new ForcibleLoader(loader);
  3. fLoader.load(new URLRequest('Movie.swf'));
  4. loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
  5. MovieClip(loader.content).gotoAndStop("hoge");
  6. });

これで、できるはず。...なんだけどコンパイルするとエラーがでる。

SecurityError: Error #3015: Loader.loadBytes() is not permitted to load content with executable code.

このエラーが出ないようにするために、ForcibleLoader.asを修正する。

Actionscript:
  1. loader.loadBytes(inputBytes);

を、これに書き換える。

Actionscript:
  1. var loaderContext:LoaderContext = new LoaderContext();
  2. loaderContext.allowLoadBytesCodeExecution = true; // that's it!
  3. loader.loadBytes(inputBytes, loaderContext);

that's it! これでできた!

と、思いきや、実はまだ問題がある。
それは、フレームを進めることはできるけど、戻すことができないこと。

Actionscript:
  1. stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
  2. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame+1);
  3. });

これで、"Player"をクリックしたときに"Movie.swf"が次のフレームに進むけど、

Actionscript:
  1. stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
  2. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame-1);
  3. });

これは何故か動かない。
でも、一番最後のフレームに行った後なら、フレーム戻れるよ!

Actionscript:
  1. stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
  2. var tmp:int = MovieClip(loader.content).currentFrame;
  3. MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).framesLoaded);
  4. MovieClip(loader.content).gotoAndStop(tmp-1);
  5. });

これで、"Player"を右クリックしたときに"Movie.swf"が1つ前のフレームに戻るようになった。無理やりだけど。

参考URL

yossy/ForcibleLoader - Spark project
AVM1Movie Controller in Flex ? Flex User
とりあえずはswfファイルの制御 - ichiro_jの日記
Markus Raab - All I don’t know. ? Blog Archive ? Select and access local SWF files within an AIR application
FLASH-JP.COM - フォーラム
神風記: ロードしたSWFのタイムラインを制御する。

コメントをどうぞ。

TrackBack URI :