• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:attachMovieで同じ深度に新しいmcを生成)

as2.0でattachMovieで新しいmcを生成する方法とは?

このQ&Aのポイント
  • as2.0でattachMovieを使用して同じ深度に新しいmcを生成する方法について教えてください。
  • ライブラリには「go_next」というmcがあり、ステージには背景のmcがあります。
  • mc「go_next」はボタンの役割を持っており、クリックすると背景のmcがスライドします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

#1です。 > 進んだり戻ったり、最初と最後で違う表示にしたりするには、 > どういった方法があるのでしょうか・・ 何というか...ですね, 最初からなぜ同じ深度に同じムービークリップを出すのか,その意味を私は全くわかってないのですよ。 つまり根本的に何をされているのかわかっていないのです。 ですから 「普通はご質問のようなこと(私が回答したようなこと)はしない。」 としか言えませんね。。。 また _root.slidePos の意味もわかっていませんから 何をどうすれば良いと言うことも書けませんし。 3種類のボタン(クリックするムービークリップ)を出す必要があるのであれば, 普通は最初から3つとも出しておきます。 出したり引っ込めたりしません。 そして最初から3種類のボタンに動作定義をしておきます。 そうしておいた上で そのボタン(クリックするムービークリップ)の _visible プロパティを切り替えます。 例えば 「Amc」「Bmc」「Cmc」という3つのボタンが要るのであれば 最初から3つともステージ上に出しておいて Amc.onRelease = function(){…云々…}; Bmc.onRelease = function(){…云々…}; Cmc.onRelease = function(){…云々…}; としておいた上で 最初は「Amc」と「Cmc」が不要である場合は Amc._visible = false; Cmc._visible = false; として「Amc」と「Cmc」を非表示にしておきます。 また _visible が false である間はボタン機能(マウスに反応すること)が消えていますからクリック動作も働きません。 それで Bmc.onRelease によって 何某かのカウンタをカウントアップするなどして 例えば カウンタが 3 以上であれば Amc._visible = true; にするとかします。 もっとも一般的にはそうするというだけで, 別に _visible の true や false を切り替えなくても良いです。 例えば 「Amc」や「Bmc」や「Cmc」内の フレーム1 を空白キーフレームだけにしておいて Amc.gotoAndStop(1); で 「Amc」を非表示しにて Amc.gotoAndPlay(2); などで表示させたり動かしても良いです。 Amc._alpha = 0; だけでの非表示はダメです。 この場合見た目は非表示ですが透明になるだけでボタン機能は働いてしまします。 上で書いたイメージの雰囲気はこんな感じです↓。 FLASH道場「方法切替ボタン」 http://www2.netwave.or.jp/~light/houkou_kirikae_btn.html

noname#199100
質問者

お礼

BlurFiltanさん  説明が不十分にもかかわらず、 丁寧に回答して下さって、ほんとうにありがとうございます。 最初から、目的に合う方法を選べていなかったんですね。 すみません・・ 仮として背景mcにたくさんボタンを配置してonClipEventでスライドさせる仕掛けを書いていて、 それを残してボタンだけ別の方法で位置を固定しようとしたため、いつのまにか滅茶苦茶になっていました。 すべてのmcを予め配置して_visibleで表示/非表示にさせる方法をやってみます。 ほんとうに助かりました。 BlurFiltanさんの解説はとても分かりやすいので、他の方への回答なども見させて頂いて勉強しようと思います。 ありがとうございます。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

書かれていらっしゃるスクリプトでできない理由はわかっていらっしゃると思いますが ActionScript に限らず どの言語でも同じで, 「その時点で存在しないインスタンスには何のプロパティも動作も設定できない」 ということです。 ActionScript であっても attachMovie に限った話ではありません。 例えば フレーム5 から登場するボタンに対して フレーム3 のスクリプトからでは,普通は何の動作も設定できません。 「存在しない物に命令などできない」 それだけのことです。 上に書いたことが原因ですから,そうしなければ良いのです。 つまり, 「存在するインスタンスに対してプロパティや動作を設定する」  ↓言い換えると↓ 「インスタンスを存在させてからプロパティや動作を設定する」 ということをすれば良いということになります。 具体的には 次のようなスクリプト(例)にすれば良いということになります。 //---------------------------------------------- //カウントアップする変数 cnt を用意 var cnt = 2; //リンケージの識別子 go_next を深度 99 に呼び出す _root.attachMovie("go_next", "go_next_to"+cnt, 99); //onRelease をセットする関数 setHandler の定義 function setHandler() { //呼び出したインスタンスに onReleaseハンドラメソッド を定義 _root["go_next_to"+cnt].onRelease = function() { //_root の 変数 slidePos に cnt の値を代入(?) _root.slidePos = cnt; //cnt の値に 1 を加算 cnt++; //リンケージの識別子 go_next を深度 99 に呼び出す _root.attachMovie("go_next", "go_next_to"+cnt, 99); //関数 setHandler を実行 setHandler(); }; } //関数 setHandler を実行 setHandler(); //---------------------------------------------- _root["go_next_to"+cnt].onRelease… に書いた [] は検索しにくいと思うので書いておきますが, この [] を「配列アクセス演算子」と言います。 Gogle検索「配列アクセス演算子」 http://www.google.co.jp/search?q=%E9%85%8D%E5%88%97%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%BC%94%E7%AE%97%E5%AD%90 また, 上のスクリプトを少し変えて次のようにするのも1つの方法です。 こちらの方が若干スッキリしてます。 //---------------------------------------------- //MCを呼び出してセットする関数 attachAndSetHandler の定義 function attachAndSetHandler(num) { // //リンケージの識別子 go_next を深度 99 に呼び出す _root.attachMovie("go_next", "go_next_to" + num, 99); // //呼び出したインスタンスに onReleaseハンドラメソッド を定義 _root["go_next_to"+num].onRelease = function() { //_root の 変数 slidePos に num の値を代入(?) _root.slidePos = num; //関数 attachAndSetHandler を実行 attachAndSetHandler(num+1); }; } //関数 attachAndSetMC を実行 attachAndSetHandler(2); //---------------------------------------------- その他 呼び出す go_next 内のフレームに this.onRelease… を書くこともあり得ますし 他にもまだまだ考え方や書き方はありますが 何にしても 「存在するインスタンスに対してプロパティや動作を設定する」  ↓言い換えると↓ 「インスタンスを存在させてからプロパティや動作を設定する」 です。

noname#199100
質問者

補足

BlurFiltanさん 回答して下さってありがとうございます。 「インスタンスを存在させてからプロパティや動作を設定する」のですね。 きちんと仕組みが分かっていませんでした。 実は作りたいものが、私にとってはかなり難しいと分かって落ち込んでいます。 「まずgo_nextがあり、クリックで順々に背景を動かしたい」の回答を頂いたのですが、 次の位置(slidePos=2)以降は「go_next」と、さらに、前の位置に戻る「go_back」も欲しいのです。 そして「go_next」は最後(slidePos=12)まで行ったらまた別のmc「go_top」を表示し、 クリックで最初の位置(slidePos=1)と状態(go_nextのみ表示)に戻りたいです。 最初は、自分で応用できるかと思ったのですが、、 これらをどうやって盛り込んでいけばいいか分からなくて途方にくれています。 二度手間になってしまってすみません。もう少し教えて頂けますでしょうか。 BlurFiltanさんに教えて頂いた「var cnt = 2;」の方法で、 失敗ですがやってみたものを書かせて頂きます。(見当違いなことをしていたらすみません・・) 戻る「go_back」用のsetHandler2で「cnt --;」にする。 これだと、進んで(slidePos=2)戻って(slidePos=1)また進もうと、すると(slidePos=3)まで行ってしまう・・ので失敗。 var cnt2 = 2; _root.attachMovie("go_back", "go_back_to"+cnt2, 100, {_x:140, _y:560, _alpha:100}); function setHandler2() { _root["go_back_to"+cnt2].onRelease = function() { _root.slidePos = cnt2; cnt2 --; }; } setHandler2(); ----------  「最後(slidePos=12)まで行ったら別のmc「go_top」を読み込む」は、 setHandlerに_root.onEnterFrame = pageend;を追加し、 function pageend(){ if(cnt > 12){ _root.attachMovie("go_top", "go_back_top", 99); } } で表示させることは出来たのですが、 最初の位置と状態に戻すのに、mc「go_top」のフレームに以下のように↓書いてみたのですがだめでした。(指のマークになるけどクリック出来ない) this.onRelease = function() { _root.attachMovie("go_next", "go_next_to", 99, {_x:900, _y:560, _height:50, _width:50, _alpha:100}); _root.slidePos = 1; } ----------  進んだり戻ったり、最初と最後で違う表示にしたりするには、 どういった方法があるのでしょうか・・

関連するQ&A

専門家に質問してみよう