![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
現在、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();
}
}
}
なにが原因なのでしょうか・・・
わかる方ご回答お願いします。。
No.1ベストアンサー
- 回答日時:
書かれていらっしゃるスクリプト中の 「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](http://oshiete.xgoo.jp/_/bucket/oshietegoo/images/media/9/1373636_5497e4d1de387/M.jpg)
この回答への補足
ご回答ありがとうございます!
無事に動作しました。
ただ、追加で質問があるのですが、swfファイルの作り方などによって動作しない、ということもあるのでしょうか?
ご指摘頂いた方法で試した結果、Flash CS5で作成したswf(四角形が楕円に変形するアニメーション)では正常に作動しましたが、javaswfというjavaのライブラリを用いて作成したswf(1フレームごとの点の座標を読み込んで、それを元に点の移動を表したアニメーション)ではstopさせることができませんでした・・・。
No.2
- 回答日時:
#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 の回答のものでは停止再生のコントロールはできません。
ご回答ありがとうございます。
やはり作り方(?)の違いでしたか。
では違うアプローチを考えてみます!
今回ご回答頂いた2件はとても参考になり、また勉強になりました!
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- その他(プログラミング・Web制作) Pythonで会員サイトの自動ログイン ID Nameがない 1 2022/12/16 02:09
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- その他(プログラミング・Web制作) uwscのCHKING関数の画像の認識がうまくいかない。 1 2022/06/18 20:55
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript JavascriptからSQLへ繋ぎ方が分からない 3 2022/07/07 00:27
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript スマフォではボタンを表示させたくない 2 2023/01/20 14:26
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
paraflaのアクションスクリプト...
-
ASではどうやって記述するのか
-
フレームでのResponse.Redirect
-
格闘ゲームのコマンド→↓→のプロ...
-
ActionScript~ロールオーバー...
-
FLASHでシーンをつなげる。
-
読み込んだテキストを Split で...
-
ムービーの早送りと巻き戻しが...
-
フレームからフレームへの移動...
-
suzukaのタイムラインの設定に...
-
左フレームの選択結果を右フレ...
-
Flashで右クリックメニューにつ...
-
フラッシュで逆再生中の停止に...
-
Flash3.0 ループ再生について
-
phpで音を鳴らす
-
ビルダー2001:フレームの保存
-
マスクの形を自由自在に変えたい
-
動画の遅延再生プログラム
-
WindowsMediaVideoをインライン...
-
ビルダー フレームページから...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
三角形ABCのBを可変にしたい
-
外部ムービー読込み後 AS が...
-
paraflaのアクションスクリプト...
-
Flash ドラック&ドロップ 色の...
-
mcのスクロール
-
Flash lite 1.1で待受け作成
-
FlashのMCに複数の動作を...
-
AS3.0でムービークリップ制御
-
【AS3.0】Timerとタイムライン
-
ムービークリップを1コマ飛し...
-
FLASH LITE1.1 制限時間を任意...
-
オンマウスでモーションを停止...
-
関数を順番に実行したい AS3
-
FLASHの同一タイムラインで、複...
-
AS3でムービークリップ再生・早...
-
AS3.0でComboBox
-
as3.0でのフレーム移動制御のス...
-
actionscript3.0で親階層にある...
-
フレーム内に移動したい
-
【C#】wavファイルの複数同時再生
おすすめ情報