牛、豚、鶏、どれか一つ食べられなくなるとしたら?

こんにちは。
外部ムービー(.swf)を読み込んでそれをスタートボタン、ストップボタンで制御したいのですが外部ムービーがスクリプトでできているためか制御できません。スクリプトでできた外部ムービーは制御不可能なのでしょうか?もし不可能ならばなんとかほかのアイデアはありませんでしょうか?ただ読み込んだものを止めたり再生したりしたいだけなのですが。。。
どうぞよろしくお願いします。
ちなみに環境WinXP Flash Pro8です。もしCS3ででもできればアイデア下さい。

A 回答 (2件)

> スクリプトでできた外部ムービー



という意味がいまひとつわかりませんが,
モーショントゥイーン や シェイプトゥイーン など,
タイムラインを使って動き作っているムービーではなくて,
ActionScript などを使って動きを作っているムービーという意味でしょうか?

読み込むムービーの中で使われているActionScript がわかっているのであれば,
Flash 8 などというハイバージョンのものでなくても,
少なくとも,変数が持てるようになった,Flash 4 の頃からそういうことは可能です。
loadMovie ができるようになった Flash 3 でも何らかの形をとれば可能だったでしょう。
(読み込まれるムービーが同じバージョンか以下のバージョンであるならばですが。)

しかし,
読み込むムービーの中で使われているActionScript がわかっていなければ,
普通は止められないでしょう。
いろんな動かし方がありますし,いろんな場所にスクリプトは存在します。

というか,
本当は loadMovie とはほとんど関係ない話だと思います。
外部にムービーがあっても,それを読み込んだ以上,
内部にムービークリップがあるのと同じです。
どこにあっても,
ActionScript で動かした以上,ActionScript で止めなければ普通は止まりません。



スクリプトでできた外部ムービーがいまひとつわかりませんが,
その「スクリプトでできた外部ムービー」みたいなサンプルを1つ作成してみました。

新規ドキュメントを作成して,
ドキュメントのサイズ(ステージの大きさ)を
横幅300px × 高さ200px に設定してください。

そして,ステージ上には何も用意せず,
フレーム1に次のスクリプトをコピペしてみてください。

そして,任意のフォルダに,
「gaibu.fla」というファイル名で,そのドキュメントを保存し,
「gaibu.swf」を同じフォルダにパブリッシュしてください。

「gaibu.fla」フレーム1にコピペするスクリプト↓。

/////////////////////////////////////////////////
// myMC1 の動く速さ spd1 の初期値を指定
spd1 = 2;
// myMC2 の動く速さ spd1 の初期値を指定
spd2 = -8;
// 背景を黄色に塗る
with (this) {
beginFill(0xFFFF80);
moveTo(0, 0);
lineTo(300, 0);
lineTo(300, 200);
lineTo(0, 200);
lineTo(0, 0);
endFill();
}
for (i=1; i<=2; i++) {
// myMC1と2 を作成
this.createEmptyMovieClip("myMC"+i, i);
// myMC1 にテキストフィールドを作成
this["myMC"+i].createTextField("myTXT", 0, 0, 0, 0, 0);
// テキストフィールドの各プロパティの設定
with (this["myMC"+i].myTXT) {
text = " myMC"+i+" ";
autoSize = true;
border = true;
background = true;
}
}
this.myMC1.myTXT.backgroundColor = 0xFFCCCC;
this.myMC2.myTXT.backgroundColor = 0x78FEFE;
// myMC1 の初期座標 を指定
this.myMC1._x = 100-(this.myMC1._width/2);
this.myMC1._y = 0;
// myMC2 の初期座標 を指定
this.myMC2._x = 200-(this.myMC2._width/2);
this.myMC2._y = 200-this.myMC2._height;
//
// 1フレーム進時間ごとに毎回実行
this.onEnterFrame = function() {
// myMC1 を spd1 の値ずつ y 方向に動かす
this.myMC1._y += spd1;
// myMC2 を spd2 の値ずつ y 方向に動かす
this.myMC2._y += spd2;
// 枠の上下にぶつかったときの処理
if (this.myMC1._y>200-this.myMC1._height) {
this.myMC1._y = 200-this.myMC1._height;
spd1 = -Math.abs(spd1);
} else if (this.myMC1._y<0) {
spd1 = Math.abs(spd1);
}
if (this.myMC2._y>200-this.myMC2._height) {
this.myMC2._y = 200-this.myMC2._height;
spd2 = -Math.abs(spd2);
} else if (this.myMC2._y<0) {
spd2 = Math.abs(spd2);
}
};
/////////////////////////////////////////////////


「gaibu.swf」をパブリッシュして見てみると,
「myMC1」と「myMC2」が,上へ行ったり下へ行ったりを繰り返すムービーができていると思います。

根幹部分を簡単に説明すると,
変数 spd1 と spd2 の値ずつ,this.onEnterFrame によって,
「myMC1」と「myMC2」を上や下に動きます。

理解すべき部分はそれだけです。
それ以外は単にそういう構造全体を用意しただけで,どうでも良いものです。



次に,
横幅550px×高さ400px のドキュメントを作成し,
同じフォルダに,「main.fla」 をという名前で保存し,
次のスクリプトをフレーム1に書いて(コピペして),
「main.swf」 をパブリッシュします。

「main.fla」 の フレーム1 にコピペするスクリプト↓。

/////////////////////////////////////////////////////////////////////////
// gaibu.swf をロードするloadMC を作成
this.createEmptyMovieClip("loadMC", 0);
// loadMC の座標を指定
this.loadMC._x = (Stage.width/2)-(300/2);
this.loadMC._y = 30;
// loadMC に gaibu.swf をロード
this.loadMC.loadMovie("gaibu.swf");
//
// 色と文字と座標のデータ配列 dat を作成
dat = new Array();
dat[0] = ["myMC1をストップ", 0xFE9696, 1, 60];
dat[1] = ["myMC1をスタート", 0xFE9696, 1, 30];
dat[2] = ["myMC2をストップ", 0x6CEEEE, 2, 60];
dat[3] = ["myMC2をスタート", 0x6CEEEE, 2, 30];
dat[4] = ["2つともストップ1", 0x74FC74, 3, 60];
dat[5] = ["2つともスタート1", 0x74FC74, 3, 30];
dat[6] = ["2つともストップ2", 0xFFFF71, 4, 60];
dat[7] = ["2つともスタート2", 0xFFFF71, 4, 30];
for (i=1; i<=8; i++) {
// btnMC1~8 を作成
this.createEmptyMovieClip("btnMC"+i, i);
// btnMC1~8 にテキストフィールドを作成
this["btnMC"+i].createTextField("myTXT", 0, 0, 0, 0, 0);
// テキストフィールドの各プロパティの設定
with (this["btnMC"+i].myTXT) {
text = dat[i-1][0];
autoSize = true;
border = true;
background = true;
backgroundColor = dat[i-1][1];
}
// btnMC1~8 の座標 を指定
this["btnMC"+i]._x = (Stage.width*dat[i-1][2]/5)-(this["btnMC"+i]._width/2);
this["btnMC"+i]._y = Stage.height-dat[i-1][3];
}
// btnMC7 と 8 を20px右へ
this.btnMC7._x += 20;
this.btnMC8._x += 20;
//
this.lineStyle(2, 0x555555, 100);
this.moveTo(this.btnMC7._x-20, this.btnMC7._y-10);
this.lineTo(this.btnMC7._x-20, Stage.height);
//
// ---★以下が本題です★----------------
//
// フラグ である変数 flg1 と 2 を true にしておく
flg1 = true;
flg2 = true;
//
// btnMC1 をクリックしたときの動作定義(※1↓)
this.btnMC1.onRelease = function() {
// flg1 の値が true のとき
if (flg1) {
// 変数 main_spd1 に ロードした swf の spd1 の値を保存
main_spd1 = loadMC.spd1;
// 即 flg1 を false にする
flg1 = false;
}
// ロードした swf の spd1 の値を 0 にする
loadMC.spd1 = 0;
};
//
// btnMC2 をクリックしたときの動作定義(※2↓)
this.btnMC2.onRelease = function() {
// flg1 の値が false のとき
if (!flg1) {
// ロードした swf の spd1 の値を保存しておいた値にする
loadMC.spd1 = main_spd1;
// 即 flg1 を true にする
flg1 = true;
}
};
//
// btnMC3 をクリックしたときの動作定義(※3↓)
this.btnMC3.onRelease = function() {
if (flg2) {
main_spd2 = loadMC.spd2;
flg2 = false;
}
loadMC.spd2 = 0;
};
//
// btnMC4 をクリックしたときの動作定義(※4↓)
this.btnMC4.onRelease = function() {
if (!flg2) {
loadMC.spd2 = main_spd2;
flg2 = true;
}
};
//
// btnMC5 をクリックしたときの動作定義(※5↓)
this.btnMC5.onRelease = function() {
if (flg1) {
main_spd1 = loadMC.spd1;
flg1 = false;
}
if (flg2) {
main_spd2 = loadMC.spd2;
flg2 = false;
}
loadMC.spd1 = 0;
loadMC.spd2 = 0;
};
//
// btnMC6 をクリックしたときの動作定義(※6↓)
this.btnMC6.onRelease = function() {
if (!flg1) {
loadMC.spd1 = main_spd1;
flg1 = true;
}
if (!flg2) {
loadMC.spd2 = main_spd2;
flg2 = true;
}
};
// - - - - - - -
flg3 = true;
// btnMC7 をクリックしたときの動作定義(※7↓)
this.btnMC7.onRelease = function() {
if (flg3) {
// myfunc に ロードした swf の onEnterFrame を保存
myfunc = loadMC.onEnterFrame;
delete loadMC.onEnterFrame;
flg3 = false;
}
};
// btnMC8 をクリックしたときの動作定義(※8↓)
this.btnMC8.onRelease = function() {
if (!flg3) {
// ロードした swf の onEnterFrame に 保存しておいた関数を設定
loadMC.onEnterFrame = myfunc;
flg3 = true;
}
};
/////////////////////////////////////////////////////////////////////////


パブリッシュした「main.swf」を開いてみると,動作確認ができると思います。

「myMC1をストップ」のボタン動作が,上の「※1」に対応しています。
「myMC1をスタート」のボタン動作が,「※2」に対応しています。
「myMC2をストップ」のボタン動作が,「※3」に対応しています。
「myMC2をスタート」のボタン動作が,「※4」に対応しています。
「2つともストップ1」のボタン動作が,「※5」に対応しています。
「2つともスタート1」のボタン動作が,「※6」に対応しています。

ストップさせるとかスタートさせるということはこういうことですよ。
読み込むムービーのスクリプトがわかっているからこそ,
上のように「spd1」と「spd2」という変数を操作してストップさせたりスタートさせることができるのです。
また,
ストップだけではなく,スタートまでさせないとならないため,
「spd1」と「spd2」の値を違う場所に保存しておくということも必要になります。


また右の方に,別扱いのボタンが2つありますが,
「2つともストップ2」のボタン動作が,上の「※7」に対応しています。
「2つともスタート2」のボタン動作が,上の「※8」に対応しています。

変数ではなく,
ストップさせるとともに関数ごと別の場所に保存しておいて,
スタートさせるときは保存しておいた関数を再び読み込んだMC内に定義してやるという方法です。
もし,
読み込んだムービー全体が,
そのムービー全体の onEnterFrame で動いている場合に限って,
この,「2つともストップ2」ボタンと「2つともスタート2」ボタンが使えるかもしれません。

しかし,
そういうもので動いているのかどうかもわかりませんから,
「2つともストップ2」ボタンと「2つともスタート2」ボタンのスクリプトを使ってもおそらくダメでしょう。




> 外部ムービーがスクリプトでできているためか制御できません。

スクリプトでない可能性もありますね。
ムービークリップ内のタイムラインの動きを使っているかもしれません。
今の主流はこれです(というか昔からこれが主流ですが)。
メインムービー(_root)のタイムラインはあまり使いません。
アニメーションするムービークリップをたくさん作って入れ替えるのです。
それの方が作りやすく,面白いことがたくさんできます。

もしこの方法によって動いているものなら,
外部ムービーのムービークリップの構造がわかっていないとストップさせたりスタートさせたりはできません。
また ムービークリップ内のタイムラインの動きを使った場合,
ムービークリップにインスタンス名が付いていなければ,
ちょっとやそっとでは制御できません。
ActionScript で動かしているものよりも厄介かもしれません。



つまり,
外部ムービーをちゃんと理解して自分で作った人でしたら,
ActionScript で動かしても タイムラインの動きを使っても,
いくらでもストップさせたりスタートさせたりはできると思いますし,また,
スタートさせたりストップさせやすいように最初から考えて作ると思います。

どういう仕組みで動いているのかわからないものは,
バージョンの問題ではなく止められません。


何でしたら,
HugFlash http://www.paw.hi-ho.ne.jp/milbesos/ などで解析されてみてはいかがでしょうか。
([Help]HugFlash - おまけモード http://www.paw.hi-ho.ne.jp/milbesos/help/content …

たいていの場合,作るより解析する方が難しいのですが。


あと,
ムービークリップ内のタイムラインの動きを使っている場合であれば,
次の URL の ANo.2 の方(ANo.1 や ANo.3 の私ではありませんよ)の回答が参考になるかもしれません。
「ボタンクリック一回ですべてのMC再生停止」
http://oshiete1.goo.ne.jp/qa2169358.html
 ↑教えて!goo ↓OKWave (同じです)
http://okwave.jp/qa2169358.html
    • good
    • 0

こちらの記事が参考になるかもしれません↓↓



http://hfm-kenchan.com/Lesson/log_qa/D0603022.htm
    • good
    • 0
この回答へのお礼

とても詳しい説明ありがとうございます!この回答に感激しました!
他人の作ったモーショントゥイーン や シェイプトゥイーン など,タイムラインを使って動きを作っているムービーではなくて,ActionScriptでできた.swfを自分のファイルに読み込んで、それを普通のモーショントゥイーンムービーを読み込んで止めるチュートリアルを見て制御しようと試みていました。
なんて初心者な私をお許しください。
本当に感謝しております、まずは書いていただいたものを試してみて構造を十分理解した上でもう一度自分のファイルで試してみます。結局自分が読み込む.swfはおっしゃるとうりthis.onEnterFrame によって動かされているようです。
では、またよろしくお願いします!

お礼日時:2007/07/03 03:48

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