- ベストアンサー
既に配置されているMCを外部から制御する方法について
- クリックイベントを使用してMCを制御する方法について質問しています。
- 現在の実装ではクリップイベントがうまく機能しておらず、変数のカウントや音の再生ができていないようです。
- メインタイムラインでの変数の宣言や音の設定は正しく行われており、ライブラリのリンケージ登録も完了しています。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.2です。 ん~・・・。 では、一回、新規作成でこの動作だけのFlashを作ってみましょう。 まず、タイムラインの「レイヤー1」の1フレーム目に下のスクリプトを記述します。 a = 0; my_sound2 = new Sound(); my_sound2.attachSound("gan1"); stop(); _root.onMouseUp = function() { a = a+1; my_sound2.start(0, 1); trace(a); _root.MC.play(); }; これは、変数aを初期化(a=0)、サウンドの前処理をしてこのフレームでstopするという ものです。ついでにその後ろへステージ(_root)をクリックした時の処理を記述しています。 これが、No.2で述べたfunction()ですね。 >function()って、関数宣言と解釈しているのですが ―その通りです。 >この場合の、functionを一度設定するといつでも >呼び出せるというのは、functionを宣言して >(今回はマウスダウン)そして、呼び出すという行為 >マウスダウンをfunctionを呼び出しているという事でいいのでしょうか? ―その通りです。 今回、function宣言の中身がその後の{};の中です。 で、呼び出す行為が_root.MouseUp、つまり、ステージ(_root)上でマウスを押して離した時 というやつです。 ちなみに、trace(a)はムービープレビュー時にa=a+1が実行されているのを確認するためです。 で、音を出すためのファイルを登録します。この場合のリンケージ名は「gan1」ですね。 この状態でムービープレビューしてみてください。クリック時に音を鳴らすことがもうできている と思います。その時に出力ウインドウに1と出てきます。これがa=a+1の結果ですね。 次に、クリックした時の制御スクリプトに「_root.MC.play();」と既にいれてあるので その「_root.MC」ですが「とりあえずの試し」なので 「Flashスタート時は四角い図形のムービークリップがあり、ステージ上をクリックした時 四角い図形が「OK」というテキストに変わる」というふうにしましょう。 制御先のムービークリップの1フレームに四角い図形を描き、その1フレーム目に stop();を記述します。2フレーム目に「OK」テキストを書き、その2フレーム目に stop();を記述します。 このムービークリップをステージに配置します。インスタンス名はMCです。 ステージ上に配置したのでこのムービークリップの絶対パスは _root.MC になります。 これをステージ上でなくステージ上の「○×△」というインスタンス名の ムービークリップに配置すれば _root.○×△.MC になります。 これで、「試し」のFlashが完成しました。 これで、ムービープレビューしてみてください。 上手く動けば四角い図形がマウスボタンを押して離した時「OK」に変わるはず。 そして、出力ウインドウにaの結果が出るはず。 で、音も出るはず。・・・なんですがどうでしょう? 独立したFlashにして解説しましたが、これを制作しているFlashに うまく組み込めば、できるようになります。 やり方がわからなかったりしたら、その動作、制御のためだけのFlashを 制作してみて、いろいろ試していくといいですよ。 これで、ダメだったらスクリプトの記述方法の他になにか原因があるのかも・・・。 ・・・というかんじです。
その他の回答 (2)
- kai123
- ベストアンサー率53% (88/163)
No.1です。 あっ!なるほど、play();はメインタイムラインでなく、MCのタイムラインに 対してですね。 そうですね、そのままだとメインのタイムライン用の「play();」になりますね。 これを特定のMCのタイムライン用の「play();」にするには 対象のMCのパスを指定してやります。 例えば、メインステージにmvというインスタンス名のムービークリップが 配置されているとします。 で、メインタイムラインのフレームでムービークリップmvに「play();」という命令 したい場合は _root.mv.play(); というふうになります。 メインステージは「_root」です。 そのメインステージに配置してあるMCは「_root.MC」となります。 「.」はこの場合、「のなかの」という意味だと捉えてくれればOKだと思います。 ということで、すべてを通して記述すると (ここではMCがメインステージ(_root)に配置してあるとします。) a=0; my_sound2 = new Sound(); my_sound2.attachSound("gan1"); _root.onMouseUp = function() { a=a+1; my_sound2.start(0,1); _root.MC.play(); }; という感じでしょうか。 1フレーム目でa=0など宣言しているので、そのままクリック時の実行処理を 記述しています。function()系は一度読み込んであれば、以後変更されない限り(※) いつでも呼び出す事できます。 ※No.1で述べた、「必要なくなったら・・・」です。 どうでしょう。 やはり、絶対パス、相対パス・・・理解したほうがいいと思いますよ。 ムービークリップ、タイムライン、ボタン間を飛んで制御できるようになりますよ。 >こんな奴がゲーム作っていいのでしょうか・・・・ いやいや、作りながら覚えて行けばいいんですよ。 自分だって手引書みても使わなければ覚えられませんよ。さすがに・・・。 っということで、ガンバってください。
補足
お返事遅くなり申し訳ございません。 ありがとうございます。 あのぉ、やはり動かないのですが。 _root.onMouseUp = function() { a=a+1; my_sound2.start(0,1); _root.MC.play(); }; をそのまま真似っこして、インスタンス名も同じにして 試しにやってみたのですが、MCが動きません。 (MCって配置すると勝手に動くのでMC自体の最初のフレームでStopかけてるのが悪いのでしょうか?) あと、文章にありました 「function()系は一度読み込んであれば、以後変更されない限り(※) いつでも呼び出す事できます。」を少し聞いていいでしょうか。 function()って、関数宣言と解釈しているのですが 呼び出すっていうのはどういう方法を現しているのでしょうか。 他プログラムをかじった経験があって その辺の解釈がごちゃごちゃになってよくわかりません。 他ソフトでfunction()を示す内容として (サブルーチンというのでしょうか) どこかにfunction()の内容を記述しておいて 必要とあればそのfunctionに飛ぶという goto "function名" とか gosub "function名"とかで そのfunctionに行き処理をして returnの命令で関数値を持って返ってきたり function自体を小カテゴリの仕事をさせたりとかで 使用した経験があります。 この場合の、functionを一度設定するといつでも 呼び出せるというのは、functionを宣言して (今回はマウスダウン)そして、呼び出すという行為 マウスダウンをfunctionを呼び出しているという事でいいのでしょうか? 意味不明な文章でゴメンなさい。 宜しくお願いします。
- kai123
- ベストアンサー率53% (88/163)
毎度、どうもです(笑 kai123です。 なるほど、クリック時になにを実行させたいのかわりましたよ。 >メインタイムラインの一番最初のフレームで・・・ その最初のフレームで定義したものと今回MCの中で使われている a、my_sound2はじつは別物です。 例えば、変数aの場合、 メインタイムラインで定義したaはそのメインタイムライン内の変数aです。 MCの変数aもそのMC内の変数aです。少し解りにくいと思いますが。 なので、そのFlash内のどこからでも変数を使用するためには、 変数名(この場合a)の前に「_root.」をつけます。 変数aの場合、_root.a と言う感じです。 同様に、音用の変数(この場合my_sound2)にも_root.をつける事により どこからでも参照できます。 _root.my_sound2 というふうになります。 以前の質問では実行する内容がわかりませんでしたので MC内にスクリプトを記述しましたが、 実はタイムライン上に記述する方法があります。 例えば、一番最初のフレームに記述してある変数の宣言(a=0)、 音の設定(my_sound2=...)のあとに _root.onMouseUp = function() { a=a+1; my_sound2.start(0,1); Play(); }; といれてやれば、MC内に前の質問のようなスクリプトは必要なくなります。 あと、MC内での実行でも、フレームでの実行でも言える事なんですが、 _root.onMouseUp = function() {};もonClipEvent(mouseDown){}も クリックした時に問答無用にその中のものを実行してしまいます。 ので、必要なくなったら実行しないようにする必要があります。 フレームのonMouseUpの場合、 _root.onMouseUp = function() {}; と必要なくなった時点でこれをしてやれば、 次回、クリック時に音の再生も変数の増減もしなくなります。 ( {}内に他の命令を入れてやればクリック時それを実行します) MC内の場合、if文等を使用しその音の制御などを実行しないようにすればよいと思います。 と、こんなかんじですかね・・・
お礼
うーん、頭がこんがらがってきました。 絶対パスとか相対パスとかいうやつですよね。 手引書みてもあの辺の話が分かりづらくついつい 飛ばしてしまってました。;; やはり避けては通れない話なんですね。 FLASHって、スプリクトをオブジェクト単位で書いたり 大元で設定したりであちこちのスプリクトを見に行かないとダメなので 苦労します。 愚痴はこの辺にして、ありがとう御座いました。 でも、もう少しだけ質問していいでしょうか。 _root.onMouseUp = function() { a=a+1; my_sound2.start(0,1); Play(); }; をメインに書いてみたのですが Play();はどうやらメインのタイムライを動かしてしまうようで 希望のMCが動きませんでした。 やはり名前か何かを付けて呼び出してあげる必要があるのでしょうか? 度々すみません。 こんな奴がゲーム作っていいのでしょうか・・・・
お礼
うぁぁぁ”ぁ””・・・・・・ スミマセン、どうしようもないミスをしていました。 ご指導くださったのは正常に動き、何故前回のが 動かないのかと思いきや、 Play と play の差だったみたいです。 命令は頭文字が大文字になると思い込み勝手に 変更していました。 いらぬ手間を取らせ誠に申し訳ございません。 でも、本当に助かりました。 スラスラと作業が進行できそうです。 ありがとうございました。