• ベストアンサー

MCクリックで任意の場所を中心に拡大したい

ステージの中心にMCを配置し、MCをクリックすると、クリックした座標を中心に徐々に拡大させたいのですが、うまくいきません。 拡大をしない場合は、 MC._x -= MC._xmouse; MC._y -= MC._ymouse; でクリックした箇所が中心になるのですが、 拡大していくとうまく計算できず大きくずれてしまいます。 onEnterFrameでMC._xscale、MC._yscaleが100から20ずつ増加し 最終的に200になるようにしているのですが、 この場合クリックした箇所を中心に拡大するにはどのように計算すれば良いでしょうか?

  • Flash
  • 回答数1
  • ありがとう数4

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

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

ムービークリップを ActionScript で動かす場合, 動きの基準はムービークリップの基準点になるという法則(仕様)があります。 つまり, ムービークリップを ActionScript で回転させる(_rotationを変える)ときは, ムービークリップは基準点を中心に回転します。 _x 座標 _y 座標も同じく基準点です。 したがって, ムービークリップを拡大縮小させるときも, そのムービークリップの基準点を中心基準として拡大縮小します。 以上が普通は知っておかなければならない前置きです。 > MCをクリックすると、クリックした座標を中心に徐々に > 拡大させたいのですが、うまくいきません。 これには定石手段が一応あるのですよ。 ここのコミュニティでもどこかに回答がありましたし, 何処かの有名サイトのページにも同様の方法提示がありました。 (両方ともURLを忘れました。) 結局, マウスをクリックした場所にムービークリップの基準点を持っていけば, (つまりマウスをクリックした場所にムービークリップの座標を動かせば), マウスをクリックした座標を基準に拡大するわけです。 しかし, その方法を使っただけだと, ムービークリップがガクッとマウスの位置まで動いてしまいます。 ですから, ガクッと動かないように,ムービークリップ自体はマウスの座標に移動させて, ムービークリップの中身は反対方向に同じ距離動かすという方法を取る必要がでてきます。 そこで, 画像をムービークリップに変換した物を, さらにムービークリップに変換して, ムービークリップの親子入れ子状態にして, 親ムービークリップをマウスの座標に持って行くと同時に, 子ムービークリップをその反対方向に同じ距離動かす。 という方法を取ります。 するとうまく行くでしょう。 これ↑が,定石の手段です。 あとは, これを場合に応じてスクリプト化するだけです。 拡大するだけは簡単ですが,縮小させることを前提としてスクリプトを書くのが少し難しいです。 クリック→「拡大」→クリック→「縮小」 を1セットとしたものを考えてみました。 まず, クリックする画像をムービークリップに変換し, インスタンス名として例えば「ko_mc」と付けます。 その「ko_mc」をさらにムービークリップに変換し, インスタンス名として「oya_mc」と付けたとしておきます。 その「親子」が存在するフレーム(フレーム1ならフレーム1)に, 次のようなスクリプトを書きます。 ------------------------------------------- // フラグの初期値を設定 flag = true; // oya_mc クリック時の動作を定義 _root.oya_mc.onRelease = function() { // flag が true であれば if (flag) { // 親が動く反対方向に同じ距離移動 this.ko_mc._x += this._x-_root._xmouse; this.ko_mc._y += this._y-_root._ymouse; // 親をマウスの座標に移動 this._x = _root._xmouse; this._y = _root._ymouse; // 1フレーム進む時間毎に随時実行 this.onEnterFrame = function() { // 大きさが 200 になるまで拡大 if (this._xscale<200) { this._xscale += 20; this._yscale += 20; } else { // 大きさが 200 以上に なれば 大きさを 200 で固定 this._xscale = 200; this._yscale = 200; // この onEnterFrame を削除 delete this.onEnterFrame; } }; } else { // flag が false であれば // 1フレーム進む時間毎に随時実行 this.onEnterFrame = function() { // 大きさが 100 になるまで縮小 if (this._xscale>100) { this._xscale -= 20; this._yscale -= 20; } else { // 大きさが 100 以下に なれば 大きさを 100 で固定 this._xscale = 100; this._yscale = 100; // この onEnterFrame を削除 delete this.onEnterFrame; } }; } // flag の true false を逆にする flag = !flag; }; ------------------------------------------- 一度目のクリック(奇数回目のクリック)で拡大し, 二度目のクリック(偶数回目のクリック)で縮小すると思います。

labilion
質問者

お礼

定石手段を教えていただきありがとうございます。 さらにスクリプトの記述までしていただき助かりました。 実際はもっと複雑なMC構造になっているのですぐに解決というわけではないのですが、これを元になんとかやってみようと思います。

関連するQ&A

  • ムービークリップの拡大縮小

    MCをクリックしたら拡大・縮小をさせたく、過去の投稿を参考にしながら、以下のscriptを作りました。 onClipEvent(load){ v_orgScale = this._xscale; v_orgX = this._x; v_orgY = this._y; zoomState = false; } on(release, releaseOutside){ zoomState = !zoomState;  this.onEnterFrame = function(){   if( zoomState ){    if(this._xscale >= v_orgScale*2.3){     delete this.onEnterFrame;    }else{     this._xscale *= 1.1;     this._yscale *= 1.1;    }   }else if( !zoomState){    if(this._xscale <= v_orgScale){     this._xscale = v_orgScale;     this._yscale = v_orgScale;     delete this.onEnterFrame;    }else{     this._xscale *= 0.9;     this._yscale *= 0.9;    }   }  }; } ただ、これだとMCの基準点(0,0)に対しての拡大縮小なのでクリックしたポイントが拡大するにつれてどんどんずれていきますよね? これをクリックしたポイントがずれないように拡大縮小する事は可能でしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • 縮小させる時の基点について

    ActionScriptを勉強中です。分からないことがあるので質問させていただきます。 ステージ上にマスクをかけたムービークリップ(インスタンス名:mc)があり、 そのmcを拡大ボタンと縮小ボタンを使い拡大/縮小できるようにしています。 mcが拡大されている時には、mc自体をドラッグして動かせるようにしています。 レイヤー構造は ーーーーーーーーーーーーーーーーーーーーーーーーーーーー 1、ボタン:拡大ボタンと縮小ボタンを配置 2、マスク ---マスクの対象:mcを配置 3、背景:背景というか枠を書いています ーーーーーーーーーーーーーーーーーーーーーーーーーーーー となっております。 mcにには ーーーーーーーーーーーーーーーーーーーーーーーーーーーー on (press) { left = Stage.width-this._width/2-2; top = Stage.height-this._height/2-98; right = this._width/2+2; bottom = this._height/2+2; this.startDrag(false, left, top, right, bottom); } on (release, releaseOutside) { this.stopDrag(); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーー 拡大ボタンには ーーーーーーーーーーーーーーーーーーーーーーーーーーーー on (release) { if (mc._yscale < 300) { mc._xscale = mc._yscale += 100; } else { mc._xscale = mc._yscale = 300; } }ーーーーーーーーーーーーーーーーーーーーーーーーーーーー 縮小ボタンには ーーーーーーーーーーーーーーーーーーーーーーーーーーーー on (release) { if (mc._yscale > 100) { mc._xscale = mc._yscale -= 100; } else { mc._xscale = mc._yscale = 100; } } ーーーーーーーーーーーーーーーーーーーーーーーーーーーー と書いています。 拡大した時の挙動は問題ないのですが、縮小する時の挙動に問題があります。 mcの中心を基点にしているため、端の方でで縮小すると余白が見えてしまいます。 この余白を見せないためにはどうしたら良いのでしょうか? 素人考えでhitTest()を使えば良いのかと思っているのですが、なかなかうまくいきません。 どうしたらよいのかご教示いただけると助かります。よろしくお願いいたします。 制作環境はCS4でAS2.0です。

  • 揺れるスクリプトについて

    こちらで教えていただいたサイトで揺れるスクリプト を勉強していたのですが、 ■をMCにして、  onClipEvent (load) {    this._xscale = this._yscale = 0;    function sMove(mScale,acc,conv) {      theScale = theScale*acc+(mScale-this._yscale)*conv;      this._xscale = this._yscale += theScale;    }  }  onClipEvent (enterFrame) {    if (this.hitTest(_root._xmouse,_root._ymouse,1)) {      sMove(130,0.8,0.2);    } else {      sMove(100,0.8,0.2);    }  } と書いたのですがプレビューすると真っ白なままなにも 表示されません。 なぜなのでしょうか?

    • ベストアンサー
    • Flash
  • createEmptyMovieで作成したMCの基準点

    アクションスクリプト2.0、FlashCS、WinXPを使用しています。 createEmptyMovie("test",1); _root.test.loadMovie("test.jpg"); _root.test._xscale = 10; _root.test._yscale = 10; onEnterFrame = function(){ _root.test._xscale += 10; _root.test._yscale += 10; } としたとき、基準点が左下になっているのですが、 これを中心とか、右上とかに変更するためには どのようにしたらいいのでしょうか。。

    • ベストアンサー
    • Flash
  • マウスを近づけるとオブジェクトが拡大するメニューなのですが・・・

    アクションスクリプトのサンプルソースは以下です。 (関係がありそうな箇所だけ) サンプルでは、横に並べているメニューなのですが 私は縦にやってみたくて・・・ しかし、このソースのままだとどうしても プレビューすると「ななめ」になってしまうのです。 どこをどう改造すればいいのでしょうか? } onClipEvent (enterFrame) { //三平方の定理を利用してマウスからの距離を求める mx = _parent._xmouse; my = _parent._ymouse; ox = this._x; oy = this._y; sx = (ox - mx)*(ox - mx); sy = (oy - my)*(oy - my); s = Math.sqrt(sx + sy); //距離が50以下の時に拡大 if(s<=100){ this._xscale = scl + (100-s)*1.5; this._yscale = scl + (100-s)*1.5; }else{ this._xscale = scl; this._yscale = scl; } 初歩的な事で申し訳ありませんが よろしくお願いします。

    • ベストアンサー
    • Flash
  • 入れ子になっているMCのクリック判定について

    Flash ver9 AS2.0 使用です。 親MCの中に子MCがいる構造です。 親MCはロールオーバーで移動、ロールアウトで元の位置へ戻るボタンアクション(onRollOver、onRollOut)を付けています。 その中にいる子MCにもロールオーバーで拡大するというアクションを付けていますが、 こちらにはonClipEventで接触判定(hitTestメソッド)で拡大するかどうかを判断しています。 分からないのは、この子MCをクリックした時に他のシーンへ移動させたいのですが、苦し紛れで onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { //拡大処理 } onClipEvent(mouseDown){ //シーン移動処理 } としても、シーン移動が出来ませんでした。(当たり前ですよね…) hitTestメソッドのクリック判定バージョンがあれば良いのですが、 検索不足か本当に無いのか見つけられませんでした。 分かり難い説明かとは思いますが、シーン移動のさせ方、またはクリック判定の仕方を教えていただきたいです。

    • ベストアンサー
    • Flash
  • マウスカーソルに応じたmcのスクロール(ループ型)

    マウスカーソルに応じて、複数配置してるmcがカーソルに合わせてスクロールして、ステージからはみ出したら、はみ出した側のステージの反対から出てくるっていうscriptを作ったのですが、うまくいきません。ループしてくれないんです。 ---- _root ---------------------- menu.mcというのがあり、そのmcの中にmenu01.mc、menu02.mc、menu03.mc・・・という感じでmcが配置してあります。menu.mc自体に別のスクリプト掛けてるので、こういう形にしてます。 ---- _root>menumc ---------------------- menu01.mcなどそれぞれのmenuのmcが入ってます。 さらに、それぞれのmcの中にscroll.mcというのをおき、そのscroll.mcにscriptが書いてあります。 ---- _root>menu.mc>menu01.mc 内scroll.mcのscript------ _visible = false; center = Stage.width/2; halfWidth = _parent._width/2; this.onEnterFrame = function() {  with(_parent){  //Scroll Speed   if (_root._xmouse<=180 || (_root._xmouse>250) && (_root._xmouse<=429)) {    moveX = (center-_root._xmouse)/15;   }else if(_root._xmouse>180 && _root._xmouse<=250){    moveX = 0;   }   _x = _x+moveX;   //Return Scroll   if(_x > Stage.width+halfWidth){    _x -= _width+Stage.width;   }else if(_parent._x < -halfwidth){    _x += _width+Stage.width;   }  } }; --------------------- で、これだときちんと思ったような動きでスクロールはするんですが、ただループしてくれないんです。しかもスクロールする毎にそれぞれのmcの間隔がずれてる気がします。最悪の場合だと、mcの上に別のmcが重なったりしてます。 なぜ、このような現象になってしまうのでしょうか?

  • MCのクリックした部分をゆっくり中央に移動させたい。

    back_mcをサイズ(600,400)のシーン上に配置し、 シーンに下記フレームスクリプトを記入し、 MCのクリックした部分を中央に移動させましたが、 これを緩やかに移動させるにはどのようにすればよいでしょうか? back_mc.onRelease = function () { _root.back_mc._x = _root.back_mc._x +(300 - _root._xmouse); _root.back_mc._y = _root.back_mc._y +(200 - _root._ymouse); }

    • ベストアンサー
    • Flash
  • ActionScript2.0での座標について

    「ActionScript2.0で、_xmouse、_ymouse でマウス座標を得られますが、_xmouse、y_mouseで得られる座標の単位はいくつになるのでしょうか? _xmouse、_ymouseを画面に出力してみると、起動するフォームの場所によっては、マイナスの値になったりするのですが、起動するフォームの場所によって値が相対的に変わるものなのでしょうか?」 以前このような質問をした者です。ご回答もいただき、自分でも調べてみて_root._xmouse や _root._ymouse と書けば、ステージの左上のコーナーが_rootの基準点になることは理解できたのですが、ステージに依存しない座標を取得する方法はありますでしょうか。

    • ベストアンサー
    • Flash
  • [Flash]actionscript2.0を用いて歯車を作りたいのですが

    Adobe FLASH CS2を使い2つのかみ合った歯車を制作しています。 ドラッグで片方の歯車を回転させると もう片方の方は逆回転になるはずですが、 うまいことactionscriptをかくことができません。 片方はこのようなactionscriptを使っているのですが うまい作り方はないでしょうか。 よろしくおねがいします。 on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //このMCの基準点とマウスとの距離を算出 td0 = Math.sqrt(rx0*rx0+ry0*ry0); //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onEnterFrame を定義 this.onEnterFrame = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; //このMCの移動を計算 }; } on (release, releaseOutside) { //この onEnterFrame を削除 delete this.onEnterFrame; }