電子書籍の厳選無料作品が豊富!

現在、AS3.0でswfファイルを読み込み、その再生・停止をコントロールするswfを作ろうとしています。
そこで自分なりにプログラム書いてみたのですが、停止ができなくて困っています。

以下ソース

package
{
import flash.display.*;
import flash.events.*;
import flash.net.URLRequest;

public class Test extends Sprite
{
private var mc:MovieClip = new MovieClip();
private var btn_load:SimpleButton = new SimpleButton(); //loadボタン
private var btn_stop:SimpleButton = new SimpleButton(); //stopボタン
private var l:Loader = new Loader();

public function Test()
{
mc.x = 30;
mc.y = 30;

btn_load.upState = this.drawCircle( 0x228822, 20 );
btn_load.overState = this.drawCircle( 0x225522, 21 );
btn_load.downState = this.drawCircle( 0x553355, 20 );
btn_load.hitTestState = btn_load.upState;
btn_load.addEventListener( MouseEvent.CLICK, Load );

btn_stop.upState = this.drawCircle( 0x228822, 20 );
btn_stop.overState = this.drawCircle( 0x225522, 21 );
btn_stop.downState = this.drawCircle( 0x553355, 20 );
btn_stop.hitTestState = btn_stop.upState;
btn_stop.x = 50;
btn_stop.addEventListener(MouseEvent.CLICK, Stop);

addChild(mc);
addChild(btn_load);
addChild(btn_stop);
mc.addChild(l);
}
private function drawCircle( color:uint, r:Number ):Shape {
var circle:Shape = new Shape();
circle.graphics.lineStyle( 1, 0x222222 );
circle.graphics.beginFill( color );
circle.graphics.drawCircle( 0, 0, r );
circle.graphics.endFill();
return circle;
}
private function Load(e:Event):void{
l.load(new URLRequest("animation.swf"));
}
private function Stop(e:Event):void{
mc.stop();
}
}
}

なにが原因なのでしょうか・・・
わかる方ご回答お願いします。。

A 回答 (2件)

書かれていらっしゃるスクリプト中の 「mc」(MovieClip) は


private var mc:MovieClip = new MovieClip();
で作成されたムービークリップなのですから "単フレーム" ですよね。

つまり フレーム1 しか存在しないはずですから
当然,再生 も 停止 もないと思います。


再生 や停止 をさせたいのは 「mc」 ではなくて,
「mc」 に配置した 「l」(Loader) 内にロードした 「animation.swf」 ではないのでしょうか?
(↓【図】 参照)

もしそうであれば
書かれていらっしゃる

private function Stop(e:Event):void{
mc.stop();
}

の部分を,

private function Stop(e:Event):void{
MovieClip(l.content).stop();
}

または,

private function Stop(e:Event):void{
var cnt_mc:MovieClip = l.content as MovieClip;
cnt_mc.stop();
}

などのように変更する必要があります。



--- 補足:階層の話 --- --- --- ---

なお書かれていらっしゃる 「l」 は
そのドキュメントクラス内で宣言された Loader を参照する変数 「l」 です。
つまり 変数 「l」 はドキュメントクラス階層内直下に存在します。

したがって
ムービークリップ「mc」の中に「l」を配置してはいますが
MovieClip(mc.l.content).stop();
にはなりません。

もし上記のように書いた場合
『「mc」内の変数「l」が参照するLoader内のコンテンツよ,止まれ。』
という意味になってしまいます。

MovieClip(l.content).stop();
これで
『ここに定義された変数「l」が参照するLoader内のコンテンツよ,止まれ。』
という意味になり,無事に動作します。
「AS3.0でムービークリップ制御」の回答画像1

この回答への補足

ご回答ありがとうございます!
無事に動作しました。

ただ、追加で質問があるのですが、swfファイルの作り方などによって動作しない、ということもあるのでしょうか?
ご指摘頂いた方法で試した結果、Flash CS5で作成したswf(四角形が楕円に変形するアニメーション)では正常に作動しましたが、javaswfというjavaのライブラリを用いて作成したswf(1フレームごとの点の座標を読み込んで、それを元に点の移動を表したアニメーション)ではstopさせることができませんでした・・・。

補足日時:2010/12/05 00:52
    • good
    • 0

#1です。



javaswfというjavaのライブラリというものがどういうものであるのかわかりませんが
swfファイルの作り方などによって動作しないという場合は無数にあるでしょう。

そもそも Flash とはタイムラインアニメーションで動かしているとは限りません。
というか... 最近はそういうものは少ないかもしれませんし,
またタイムラインアニメーションであってもムービークリップ内の階層に作る場合がかなりあります。


「タイムラインアニメーションで動かしていない場合」というのは
ActionScript で動かしている場合です。

SWFのメインのタイムラインはほんの1~数フレームだけで,
ActionScriptで延々と動く物はたくさんあります。
そのようなものは当然 「stop() ←タイムラインの再生を止める」 では止まらないでしょう。

> swf(1フレームごとの点の座標を読み込んで、それを元に点の移動を表したアニメーション)

これもそうじゃないですか?
実際にはフレームは1フレームしかなくて
enterFrame や Event.ENTER_FRAME 系で座標データ通りにインスタンスを動かしているのかもしれません。
もしそうである場合はそういうスクリプトを消さない限り止まりません。


「タイムラインアニメーションであってもムービークリップ内の階層に作る場合」というのも
文字通りそのままのことですが,
SWF のメインのタイムラインは 1フレーム くらいしかなくてその
そのメインのタイムライン内に置いたムービークリップの中でアニメーションが動いている場合です。
この場合
SWF のメインのタイムラインは 1フレーム くらいしかないのですから
これまた当然 「MovieClip(mc.l.content).stop(); ←子SWFのメインタイムラインの再生を止める」 では止まらないでしょう。
内部のムービークリップの中の再生を停止させなければなりません。


また
ActionScript 3.0 と 2.0 以下は共存できませんから
ActionScript 2.0 以下で作られた SWF を ロード した場合も
思惑通りに動かないのが当然と思った方が良いです。



最初のご質問から
「子SWF も自作のもの」 で
「子SWF はメインのタイムラインを使ったアニメーション」 で
「子SWF も 親SWF も作成環境は同じだろうから ActionScript のバージョンも同じ」 だろう。
と推測したので
それを大前提として #1 の回答を書いたのです。
どれかの条件かが変わると,当然 #1 の回答のものでは停止再生のコントロールはできません。
 
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

やはり作り方(?)の違いでしたか。
では違うアプローチを考えてみます!

今回ご回答頂いた2件はとても参考になり、また勉強になりました!
ありがとうございました。

お礼日時:2010/12/05 21:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!