- 締切済み
レイヤー内のすべてのMCのXY位置やScaleを変更したい!
こんにちは。よろしくお願いします。 使用しているのは、「FlashMx2004」です。 レイヤーの中にMCが10個ほどあるのですが。このどれかのボタンをクリックしたときに、10個のMCすべてが、拡大縮小されるような仕組みを作っています。 一つ一つ、拡大縮小の命令をだせば言いと思うのですが、もっと楽なやり方ってないのでしょうか? イメージが湧きにくいかと思いますので、作成している物も、書き記そうと思います。 「地図」で。マスク処理により、左右前後に動きます。 地図内には、地域分けする為の枠があり、枠をクリックすると、クリックされた枠を中心に拡大されるような地図を作りたいです。 言葉足らずかも知れませんが、よろしくご教授ください。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
#1です。 ムービークリップを入れ子にするのはお試し済みとのことですが・・・ 地図のムービークリップの中に枠のムービークリップを配置し、枠の各インスタンスに名前を付けます。すると、地図と枠は親子階層になります。 子である枠がクリックされた時に親である地図全体を拡大・移動する、という具合でアクションを組むと、1つ1つを変形する処理にはなりませんが、これではご希望の形になりませんでしたのでしょうか?親子になっているムービークリップは、親が拡大・移動すれば子もその変形に従って拡大・移動します。 例えば、地図のインスタンス map があるとします。map の中には、枠のインスタンス area1 ~ area10 があります。 各枠のターゲットパスは、map の中ですので map.area1 ~ map.area10 となります。これがクリックされた時に map が拡大されればいいので、スクリプトは //枠1がクリックされた時、地図全体を2倍に拡大 _root.map.area1.onPress = function () { _root.map._xscale = 200; _root.map._yscale = 200; }; map は map の中心点を基準に拡大されます。枠を中心に拡大されているように見せるには、各枠ごとに違う移動量を設定して、map の位置を調整する処理も必要になるかと思います。 しかしこの方法でも、結局は、全ての枠での処理をそれぞれ設定しなければなりません。 (ちなみに、onPress など MovieClip オブジェクトのイベントハンドラを使った処理の定義は、フレームアクションとして、1箇所にまとめて設定できます) これも面倒だというのであれば、あとは計算で出すくらいしか、思い付かないのですが。 計算で出すなら、地図に枠を描いたムービークリップ1つで済みます。 1つのムービークリップを拡大しますから、先述の方法と同様に、枠ごとの位置補正用の情報が必要になります。この移動量は、予め配列で用意しておきます。 クリックされた時のマウスカーソルの座標から、クリックされたポイントがどの枠にあたるのかを計算で割り出します。枠ごとの移動量を配列で持っていますから、対応する番号の配列を見ると、どのくらい地図を移動させればいいのかが分かります。地図を拡大し、配列から拾ってきた移動量を元に表示位置を補正して出来上がりです。 これなら、確かに地図のムービークリップ1つでいいですし、スクリプトの設定も1箇所で済むのですが、計算式が絡むので、かえって分かりにくいスクリプトになる気がします。
- DPE
- ベストアンサー率85% (666/776)
for ループと eval を組み合わせてスクリプトを組んでみてはいかがでしょう。 ムービークリップのインスタンス名を、通し番号を使って付けます。ここでは仮に、clip1 ~ clip10 とします。 eval は、文字列を使ってインスタンス等にアクセスするためのアクションです。例えば、 eval( "_root.clip1" )._xscale = 200; こうすると、_root.clip1 の _xscale プロパティを操作できます。 eval に渡す文字列には、 eval( "_root.clip" + i )._xscale = 200; このように変数を使うことも可能ですので、これを for ループと組み合わせます。インスタンス名を通し番号で付けるのは、実はこのためです。 なお、操作したいプロパティが多数ある場合は、with アクションを併用するとスクリプトがスッキリまとまります。 for( i = 1 ; i <= 10 ; i++ ) { // clip1 ~ clip10 を全て2倍に拡大 with( eval( "_root.clip" + i ) ) { _xscale = 200; _yscale = 200; } } (↑このスクリプトをコピーして利用する場合は、行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります) ちなみに、同様に for と eval を使って for( i = 1 ; i <= 10 ; i++) { eval( "_root.clip" + i ).onPress = function () { ・・・ }; } として、onPressイベント発生時、つまり、ムービークリップがクリックされた時に行う処理を、まとめて定義することもできます。 (ただし、各ムービークリップがクリックされた時に行う処理が全て同じ場合か、もしくはループを使って定義できるような処理に限ります) ボタンのように使うムービークリップが多数あるようですので、よろしければこちらも合わせて利用してみてください。
補足
すみません。私の言葉足らずでしたね。 For文などでは、最終的に「一つ一つに命令をする事」になりますよね? 配列にすればいいとか。名前に通し番号をつけることは、一切やっていません。 というのも、アトで見たときに、自分で解らないプログラムは作らないよう心がけているからです。 それに、絵をとっかえひっかえ。すると大変なことになりそうで・・・ たとえば、グループ化して、それに名前を付けたりできないのか?ということを聞きたかったんです。 自分で色々やってみたのですが、MCの中にMCをいれたり、グループ化して、グループに名前を付けれないか試したのですが、うまくいきませんでした。 あとEvalは初めて聞きました。 こういうものもあるんですね~ ちょっと勉強になりました。ありがとうございます♪
お礼
結局は、「そんな割のいい話はない」って事なんですかね~。 ちなみに、入れ子にしたときは、一緒に拡大縮小はしてくれたんですが、肝心の「枠をクリックした時の処理」が上手くいかなかったんです。 まず、ボタン自身に名前などをつけなかったのと、ボタン自身への処理を書かなかったためでしょうね。 何度もありがとうございました。 まだまだ、上の説明を読むのも苦労する初心者ですが、がんばっていきたいと思います。 せめて、皆さんの説明がすぐに理解できるようになりたいです♪ 本当にありがとうございます。 あと、幸薄い期待を胸に、もう2,3日回答をまってみますね。