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"で
-
var loader:Loader = new Loader();
-
loader.load(new URLRequest("Movie.swf") );
-
addChild(loader);
-
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
-
MovieClip(loader.content).gotoAndStop("hoge");
-
});
ってすれば簡単に上記のやりたいことが達成できる。たぶん。
でも、"Movie.swf"がAVM1Movieの時はそうはいかない。
でもでも、ForcibleLoaderをつかえばできるよ!
-
var loader:Loader = Loader(addChild(new Loader()));
-
var fLoader:ForcibleLoader = new ForcibleLoader(loader);
-
fLoader.load(new URLRequest('Movie.swf'));
-
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function (e:Event):void{
-
MovieClip(loader.content).gotoAndStop("hoge");
-
});
これで、できるはず。...なんだけどコンパイルするとエラーがでる。
このエラーが出ないようにするために、ForcibleLoader.asを修正する。
-
loader.loadBytes(inputBytes);
を、これに書き換える。
-
var loaderContext:LoaderContext = new LoaderContext();
-
loaderContext.allowLoadBytesCodeExecution = true; // that's it!
-
loader.loadBytes(inputBytes, loaderContext);
that's it! これでできた!
と、思いきや、実はまだ問題がある。
それは、フレームを進めることはできるけど、戻すことができないこと。
-
stage.addEventListener(MouseEvent.CLICK, function(e:MouseEvent):void {
-
MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame+1);
-
});
これで、"Player"をクリックしたときに"Movie.swf"が次のフレームに進むけど、
-
stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
-
MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).currentFrame-1);
-
});
これは何故か動かない。
でも、一番最後のフレームに行った後なら、フレーム戻れるよ!
-
stage.addEventListener(MouseEvent.RIGHT_CLICK, function(e:MouseEvent):void {
-
var tmp:int = MovieClip(loader.content).currentFrame;
-
MovieClip(loader.content).gotoAndStop(MovieClip(loader.content).framesLoaded);
-
MovieClip(loader.content).gotoAndStop(tmp-1);
-
});
これで、"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のタイムラインを制御する。

初めましてー、鹿と申します。
まさにこの「AIRでAVM1Movieを読み込んで制御」がしたかったので、
この記事を見て、実践できたので非常に感激&感謝しております。
(AVM1は制御無理じゃろと半ば諦めてたので)
・気になった点がありましたので、メモさせて下さい。
使用したのは、Flash CS4にてAIR1.5であります。
記事にありますように作成しましたところ、
「ForcibleLoader.as のLoaderContextが 『型が見つからないか、コンパイル時定数ではありません』」とか文句言われたので、
ForcibleLoader.as の40行目らへんに
「import flash.system.LoaderContext;」を書き足したら無事に動きました。
(それを足すのが当たり前でしたら、素人ちっく追記でスミマセン。m(_ _)m)
鹿さんはじめまして!
お役に立てたみたいで、良かったです。
importについて書くの忘れてました。追記ありがとうございます。
[...] osamXさん(フラスコ)の 記事『loaderで読み込んだswf(AVM1Movie)の再生制御』に救われました! [...]
[...] 「SWFにgotoAndPlay()を発行したが、反応がない」 osamXさん(フラスコ)の 記事『loaderで読み込んだswf(AVM1Movie)の再生制御』に救われました! [...]