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

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

attachMovieで同じ深度に新しいmcを生成

as2.0です。 ライブラリにmc「go_next」があり、ステージには背景のmcがあります。 mc「go_next」はボタンの役割で、クリックすると背景のmcがスライドします。 次々とスライドさせて行きたいので、mc「go_next」をクリックするたびに新しいmcとして入れ替えたいので、attachMovieで同じ深度に生成してみたのですが、上手くいきません。 フレームに以下のように記述しました。 _root.attachMovie("go_next", "go_next_to2", 99); go_next_to2.onRelease = function() { _root.slidePos = 2; _root.attachMovie("go_next", "go_next_to3", 99); } go_next_to3.onRelease = function() { _root.slidePos = 3; _root.attachMovie("go_next", "go_next_to4", 99); } まず"go_next_to2"がステージに生成されています。 "go_next_to2"をクリックすると"go_next_to3"が生成され、"go_next_to2"は消えます。 (ここまでは成功しています。) 次にその"go_next_to3"をクリックして同様に"go_next_to4"に差し替えたいのですが、 "go_next_to3"がクリックできるようになりません。 同じ場所に差し替えたのだから同じ設定で繰り返せばいいかと思ったのですが・・ どうやったら次々と新しいmcに入れ替えていくことができますか? 教えて頂けたら嬉しいです。 よろしくお願いします。

noname#199100
noname#199100
  • Flash
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • 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

  • duplicateMovieClipで生成したmcの深度

    こんにちは。 Mac OS X/バージョン10.6.2 ActionSpript2,0 ステージ上にmcがあって、その後ろを duplicateMovieClipで空の背景を生成して移動させて 絶えず雲が動いているフラッシュを作りたいのですが・・・ 移動は上手くいったのですが、深度が上手く行かず 背景がmcの全面に来てしまいます。 よろしければご指導の程、お願いします。 背景=haikei ********************** var speed = 10; _root.haikei.duplicateMovieClip("haikei2",-1);    ここで深度を設定しているんですよね?↑ _root.haikei2._x -= _root.haikei._width; this.onEnterFrame = function() { _root.haikei._x += speed; _root.haikei2._x += speed; if (_root.haikei._x>_root.haikei._width) { _root.haikei._x = _root.haikei2._x-_root.haikei._width; } if (_root.haikei2._x>_root.haikei2._width) { _root.haikei2._x = _root.haikei._x-_root.haikei2._width; } }; ***************** まだまだ未熟者で、duplicateMovieClip,depth等で検索などし、 試したのですが上手く行かず・・・理解できず・・・でした。 よろしくお願いします!

    • ベストアンサー
    • Flash
  • attachMovieで表示した複数のMCが一瞬ずつしか表示されません

    attachMovieでMCを複数表示しているのですが、 ランダムに表示したMCが一瞬ずつしか表示されません。 やりたいことは、aaaというMCが横位置と大きさがランダムで表示され、 下にまっすぐ落ちるという動きです。 こちらの記事を参考に作成しました。 http://oshiete1.goo.ne.jp/qa2500105.html -------------------------------------- // 深度の初期値を設定 var dep = 0; // 大きくなる限度を設定 var mag = 80; _root.dep++; _root.attachMovie("aaa", "myMC"+_root.dep, _root.dep); //座標を指定 _root["myMC"+_root.dep]._x = Math.random()*Stage.width; //下に落ちていく _root["myMC"+_root.dep]._y += 10; // 大きさを指定 var my_scale = Math.random()*_root.mag; _root["myMC"+_root.dep]._xscale = my_scale; _root["myMC"+_root.dep]._yscale = my_scale; -------------------------------------- ランダムに表示はできるのですが、すばやく消えて、すぐに次のMCが 表示されてしまいます。 同じ深度に表示されているように見えますが、 _root.dep++; で 深度は変わっているはずなんですが…。 ちなみに stop(); を入れたらひとつだけ表示されましたが 下に落ちていきませんでした…。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • MCの重なり順

    今、ボタンをクリックするごとにattachMovieでステージ内にMC(ボールのアニメーション)を配置するというものを作っています。 ステージ内に設置したカラーバー(スライダー?)からsetRGBでそれぞれのMCに色をつけています。 そこで、それを応用して背景も色を変えられればいいなぁと思い、背景部分をMCにして背景ボタンを作り、 色を選択して背景ボタンを押すと、背景の色が変わるようにしました。 これで背景の色を自由に変えることができるようにはなったのですが、 クリックして出現させたボールMCの上に背景が重なってボールが見えなくなってしまいます。 きっとこれは深度に関係しているんだろうとは思いましたが、背景もattachMovieで複製させているため、どうしていいかわかりません。 もしくは、背景をMCにしないで色を変える方法があればいいのかとも思うのですが…。 環境はXP、FlashMXです。 どなたか分かる方、解答よろしくお願いします!!

    • ベストアンサー
    • Flash
  • すべてのMCを1フレーム目へ

    ステージ上にMCのインスタンスが100個あるとします。 ボタンのクリックで全部のMCを1フレーム目へ移動させたいと思っています。 _root.EVENT_btn.onRelease = function() { _root.A_mc.gotoAndStop(1); _root.B_mc.gotoAndStop(1); _root.C_mc.gotoAndStop(1); _root.D_mc.gotoAndStop(1); : : } とひとつずつ書くしかないのでしょうか? ほかに効率のよい書き方はありますか? (注)すべてのインスタンスの親は同一オブジェクトではありません。

    • ベストアンサー
    • Flash
  • actionscript2.0でMCの切り替えなど

    Flash初心者で勉強中の身なのですがどうか質問させてください。 根本的に間違っていたりできないことをやろうとしていたら申し訳ないです。。 その際にはこう改変した方がいいとのご指示をご教示頂きたいです。よろしくお願いいたします。 attachMovieを使ってライブラリ内のMCをステージに呼び出し、そのMCを押す度にそのMCを切り替えたいと考えています。 ライブラリにはa1,a2,,,a5、b1,b2,,,,b5,c1,d1,e1…という識別子をつけたMCを用意しています。 a-eの横幅は80×80です。 20ずつ間を空けて○1のMCを横一列に配置しました。 _root.attachMovie("a1", "a1",1, {_x: 100, _y: 100}); _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); _root.attachMovie("c1", "c1",1, {_x: 300, _y: 100}); _root.attachMovie("d1", "d1",1, {_x: 400, _y: 100}); _root.attachMovie("e1", "e1",1, {_x: 500, _y: 100}); このMCを押すと、MCが数字の大きいものに切り替わる(b1を押すとb2のMCに…で5まで)ようにしたいので、 ひとつひとつを下記のscriptで記述しました。 _root.attachMovie("b1", "b1",1, {_x: 200, _y: 100}); b1.onPress=function(){ b1.removeMovieClip(); _root.attachMovie("b2", "b2",1, {_x: 200, _y: 100}); b2.onPress=function(){ b2.removeMovieClip(); _root.attachMovie("b3", "b3",1, {_x: 200, _y: 100}); b3.onPress=function(){ b3.removeMovieClip(); _root.attachMovie("b4", "b4",1, {_x: 200, _y: 100}); b4.onPress=function(){ b4.removeMovieClip(); _root.attachMovie("b5", "b5",1, {_x: 200, _y: 100});}}}} これをa-e同じことを繰り返しています。 ここからが問題なのですが、 ここで例えば a2,b5,c1,d3,e1 という風に適当に押されてMCが切り替わり、整列させるボタンが押された時、 その数字を参照して 縦に20pxずつ空けながら b5 (空行/4があった場合の行) d3 a2 c1(20pxの空白)e1 と並べ替えたいと思っています。 つまり、a-eが現在どの数字(○1,○2..)なのかを調べ、その数字の若い方から順に縦に配置させたいと考えています。 また、上のc1,e1のように1の数字のMCが2つ以上あった場合は、同じ行に20pxずつ空けて横に配置していきたいのです。 その調べた数字の順に縦と横に並べ替える(新たにステージ上に配置し直す)というルール付けをどういうscriptを書けば上手く行くかが自分ではどうにも分からず、ここから進めない状態です。。 誰がどんな回数押したとしてもそれに準じた整列をして欲しいのですが、そのやり方があるようでしたらどうかご教示頂きたいです。 また、上記の私の書き方では難しいようでしたらそこから改変したものをお教え願いたいです。 分からないことばかりで申し訳ないのですが、何卒よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ランダムに mcを連続attachMovieさせるアニメ

    MX2004初心者です。 ライブラリにsakura_mc(10フレーム)があります。 さくらの花びらが手前に飛んでくるこまアニメです。 //乱数生成関数 function rndInit(maxNum){   var a = math.random();   var b = Math.ceil( a*maxNum );   return b; }  MC = "sakura"  SW = Stage.width;  SH = Stage.height; this.onEnterFrame = function(){   if( rndInit(10) == 1 ){   count ++;   newName = MC + count;   attachMovie( "sakura_mc", newName, 1 );   //表示位置の設定   this[ newName ]._x = Math.random()*SW;   this[ newName ]._y = Math.random()*SH;    } }  この方法だと、sakura_mcがステージ上ランダムな位置に連続で再生 してくれます。  ただ、二つ以上のsakura_mcを同時にステージに再生はしてくれません。  sakura_mcを同時にいっぱい再生させたい場合はどうすればよいでしょうか?  sakura2_mcをつくって同じ命令を追加してもダメでした。  よろしくお願いします。

    • ベストアンサー
    • Flash
  • MC間でMCをやり取りできますか?

    質問は初めてですがよろしくお願いします。 深度入れ替えの関係で(簡略化のため)、MCを似たような深度ずつに親MCにまとめる構造で作成してきました。 しかし、このやり方では、当初予定していた深度の移動はできますが、予定外の深度の移動が、不可能になりました。 やりたいこと _root.a.mc のような構造の中のmcというムービークリップを、 _root.b.mc の階層に移動したいのです。mcの持つ変数等も一緒に移動できるのが好ましいです。 不可能であれば、 attachMovie()、removeMovieClip()あたりを使って負荷のかかりそうなやり方で我慢しようとは思っています。 ParaFla!使用・SWF8:FLASH8相当の設定で製作中

    • ベストアンサー
    • Flash
  • AS2 attachMovie 外部画像対応に

    AS2 attachMovie 外部画像対応にしたい <やりたいこと> AS2 attachMovieを利用して、複数画像を読み込むサンプルがあるのですが、 これを外部画像読込対応に変更したいです。 <知りたいこと> AS2 attachMovieで、外部画像を読み込む簡単なサンプルコードを 作成していただけないでしょうか? あるいは、下記内容を、どう修正すればよいでしょうか? <現状> ・画像は「image_1」「image_2」「image_3」って感じで、ムービークリップにして、ライブラリへ入れてます。 ・ステージ上に画像は、配置せず、変わりに、ムービークリップのリンケージ識別子を、それぞれ「image_1」「image_2」「image_3」としています、また、「ASに書き出し」「最初のフレームに書き出し」にチェックを入れてます <現状のコード一部> next_bottun.onPress = function() { if (image_maisu>next_i) {//イメージ枚数より選択イメージが少なかったら next_i += 1;//選択イメージを加算 var mc_name = "image_"+next_i;//識別子の名前を変更して change_mc(mc_name, syoki_sokudo);//切り替わり関数に送る } }; function change_mc(mc_name, syoki_sokudo) { i++;//IDを加算して var new_name = "image_"+i;//インスタンス名を設定 var syoki = {_alpha:0, i:i, sokudo:syoki_sokudo};//初期値を設定 _root.main.attachMovie(mc_name, new_name, i, syoki);//mainの中に生成する

  • attachMovieで生成したインスタンスを消す方法

    1.現在A.B.C・・・・という名前の多数のボタンがあります 2.それぞれをクリックすると、A1.B1.C1・・・・とそれぞれのインスタンスがZ_mcというムービークリップ内に生成されます。その時にボタンに記述したスクリプト on (press) { Z_mc.attachMovie( "識別子", "A1", 1); } 3.このままですとA.B.C・・・・とボタンをクリックしていくとインスタンスがA1.B1.C1・・・・と同じ場所に生成されるため、重なってしまいます。 どのようにボタンにスクリプトを記載すれば、前に生成されたインスタンスを削除して、新しいインスタンスを生成できるのでしょうか?よろしくお願いします。

    • ベストアンサー
    • Flash
  • attachMovieで生成したインスタンスへの文字代入

    FlashMX(AS1.0)を使用しています。 ダイナミックテキストを子にしたムービークリップのインスタンスをattachMovieで配置したのですが、ダイナミックテキストに文字列を代入しても文字のみが表示されません。 試しに、duplicateMovieClipでコピーした場合はダイナミックテキスト内の文字は表示されています。 スクリプトは以下のように組んでいます。 (略) 1:cnt++; 2:samp_mc = "tag"+cnt; 3:_root.attachMovie("sym_ln",samp_mc,cnt);//sym_ln...ダイナミックテキストを含んだシンボルのリンケージ 4:samp_mc.dymtxt = "123";//dymtxt...ダイナミックテキストの変数名 インスタンスを配置してもdymtxtに表示されません。が、 3:base_mc.duplicateMovieClip(samp_mc,cnt);//base_mc...ステージに配置したmcのインスタンス名 とすると表示されます。 attachMovieを使用してインスタンスを配置するようにしたいのですが、文字が表示されないのはどこに原因があるのでしょうか?

    • ベストアンサー
    • Flash

専門家に質問してみよう