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

この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)に対しての拡大縮小なのでクリックしたポイントが拡大するにつれてどんどんずれていきますよね? これをクリックしたポイントがずれないように拡大縮小する事は可能でしょうか? 宜しくお願いいたします。

  • coder
  • お礼率68% (13/19)
  • Flash
  • 回答数1
  • ありがとう数15

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

  • ベストアンサー
noname#35109
noname#35109
回答No.1

閃きました。 理解すれば,難しいスクリプトも複雑な計算も一切要らない,簡単な方法です。 >> MCの基準点(0,0)に対しての拡大縮小なので >> … … どんどんずれていきますよね? そうです,そうです。 それに,拡大するにつれてマウスと逆方向にムービークリップを動かそうとしても,  this._xscale *= 1.1; のような2次関数的な拡大をするため,  this._xscale = v_orgScale*2.3 になった状態の時点では,うまくマウスの位置に合わせられたとしても, 途中の拡大中ではズレますよね。 私も30分くらい唸って考え込んでしまいました。 でも良い方法を思いつきました。 少々ややこしいかもしれないので,順を追って説明します。 『MCは 基準点 を基準に拡大縮小するのですから, クリックしたときのマウスのポイントにMCの 基準点 を持ってくれば良い。』 というわけです。 でも,MCの基準点を動かすスクリプトなんかありません(多分)。 MCの基準点を動かすスクリプトがないのであれば,MC自体を動かせば良いのです。 しかし,MC自体を動かせば,マウスの位置にいつもMC中心が来てしまいます。 それは困るので,そのMCの中に 子MC を作って, 親MC が動いたのと逆向きに同じ距離 子MC を動かしてやれば,MC全体としては基準点のみがマウスの位置に移動することになります。 わかりますでしょうか。 MCを入れ子にして, そのMCをクリックしたとき, 親MCの基準点をマウスのクリックポイントに移動させ, 子MCをそれとは逆方向に移動させる。 すると子MCは元の位置を保ち, 親MCの基準点はマウスのクリックポイントに移動するわけです。 簡単な例で原理を説明します。 ステージ上に,塗りで大きめの四角でも描きます。 その四角をムービークリップに変換します。 そしてその四角いMCにインスタンス名を付けます。 ここでは,「childMC」 というインスタンス名にしておきます。 そしてその 「childMC」 をさらにムービークリップに変換します。 そしてその変換したMCに次のようなスクリプトを書きます。 ----------------------------------- on (release, releaseOutside) { this.childMC._x += this._x-_root._xmouse; this.childMC._y += this._y-_root._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; } ----------------------------------- このままパブリッシュしてもわかりにくいと思うので, そのムービークリップ内の編集に入ります。 ムービークリップ内にはすでに 「childMC」 が存在していると思います。 その上にもう1つレイヤーを追加して, そのレイヤーにムービークリップの基準点に「×」印 でもかいておきます。  □ レイヤー 筆・・|●| ←「×」印  □ レイヤー 筆・・|●| ←「childMC」 そして,パブリッシュ。 MCをクリックすると,そのポイントに「×」印は移動すると思いますが,「childMC」 は動きません。 (嬉しそうにクリックして 「×」印 を動かしている姿をもし他の人が見ると,意味不明で変な人だと思われるかもしれませんが,本人の中では 「×」印 が動いても 「childMC」 が動かないので嬉しい気分になります。) 実際の方法ですが。 質問で書かれているMCのスクリプトを全部消して, そのMCにインスタンス名を付けます。 ここでも 「childMC」 というインスタンス名にしておきます。 その 「childMC」 を選択して,もう一度ムービークリップに変換します。 そして,次のようなスクリプトを,そのMCに書けば行けると思います。 ※インデントを付けるため,   スクリプトの各行の前には全角空白文字を   たくさん入れています。   コピペする場合は全角空白文字を削除してください。 ----------------------------------- onClipEvent (load) {  v_orgScale = this._xscale;  v_orgX = this._x;  v_orgY = this._y;  zoomState = false; } on (release, releaseOutside) {  zoomState = !zoomState; // ------ ↓ここから追加↓ ------  if (zoomState) {   this.childMC._x += this._x-_root._xmouse;   this.childMC._y += this._y-_root._ymouse;   this._x = _root._xmouse;   this._y = _root._ymouse;  /*  } else if (!zoomState) {   this.childMC._x += (this._x-_root._xmouse)/2.3;   this.childMC._y += (this._y-_root._ymouse)/2.3;   this._x = _root._xmouse;   this._y = _root._ymouse;  */  } // ------ ↑ここまで追加↑------  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;    }   }  }; } ----------------------------------- // ------ ↓ここから追加↓ ------           ~ ~ // ------ ↑ここまで追加↑------ と書いてある部分が追加した部分です。 他は一切変えていません。 その中の,  /*  } else if (!zoomState) {      ~ ~   this._y = _root._ymouse;  */ の数行を 「/*」 と 「*/」 でコメントブロック扱いにしていますが, これは,縮小するときにはどうするのかがわからなかったからです。 「/*」 と 「*/」 を付けたままで行くと, 拡大するときは,マウスを中心に拡大しますが, 縮小するときはそのまま縮小するので,元の位置に帰ります。 「/*」 と 「*/」 を取ると, 拡大するときも縮小するときもマウスを中心に拡大縮小します。 でも,元の位置には戻りません。 どちらにするかは選んでください。 上で「閃きました。」と書きましたが, 私が知らなかっただけで, 上記の方法は基準点を動かすためにすでにある定石手段かもしれません。 === PS ======== 質問で書かれているスクリプトですが, 無理・無駄・斑(むら)のない,本当にきれいでわかりやすいスクリプトですね。 "基準点"という用語の使い方も正しいですし,何を質問されているのかもよくわかりました。 なかなか,こんなにわかりやすい質問をされる方にはお目にかかれません。 良質問 で質問者に20ポイント! と行きたいですが,それはできないようなので, 「このQ&Aは役に立った」 に1票入れておきます。

coder
質問者

お礼

いや~~すごいっ!! 前々からActionScriptを絡めて、基準点をなんとか変更できないかな~~って職場の人と話してたんですよっ! こんなアイディアを30分で閃いちゃうなんて、すごすぎです。 ありがとうございました!!

関連するQ&A

  • 縮小させる時の基点について

    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です。

  • 3つのムービークリップ再生・巻き戻しの順番制御

    初めまして。 初心者につき、基本的な事だとは思うのですが、調べても分からなかったため、こちらで質問させて頂きたいと思います。 3つのムービークリップ(a_mc,b_mc,c_mc)【フレーム数30】と、 各々を再生させるためのボタン(A,B,C)を使って、 b_mcを再生中にAのボタンを押すと、b_mcを巻き戻した後で、 a_mcを再生するといった感じで3すくみのような状態にしたいのですが、b_mcの巻き戻しとa_mcの再生が同時に行われてしまいます。 現在のActionScriptは以下のようなものなのですが、どなたかご教授願えませんでしょうか? よろしくお願いいたします。 ボタンAのスクリプト on (release) { //Cの巻き戻し _root.c_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //Bの巻き戻し _root.b_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //BでもCでもないときの判別式? //Aの再生 _root.a_mc.onEnterFrame = function() { if (this._currentframe<=29){ this.gotoAndPlay(this._currentframe); delete this.onEnterFrame} } }

    • ベストアンサー
    • Flash
  • loadMovie の拡大縮小

    初めまして、ActionScript についてご質問があります。 loadMovie で外部ファイルのswfを、ムービークリップ「screen」で表示させています。 ボタンで以下のActionScriptを使って、 「screen」を拡大縮小しようと思っております。 on(release){ screen._xscale *=1.2; //幅を1.2倍に拡大 screen._yscale *=1.2; //高さを1.2倍に拡大 } on(release){ screen._xscale /=1.2; //幅を1/1.2倍に縮小 screen._yscale /=1.2; //高さを1/1.2倍に縮小  } これだと無限に拡大縮小ができてしまいます。 上限下限を設定することは可能でしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • MCクリックで任意の場所を中心に拡大したい

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

    • ベストアンサー
    • Flash
  • 外部SWFの中のムービークリップを拡大したい

    こんばんわ! ちょっとわからないことがあるので質問があります。 よろしくお願いします。 メインの空ムービー(インスタンス名"loadpoint")に外部SWF"hallo.swf"を読み込むとします。 メインに取り付けた拡大、縮小ボタンで 外部SWF"hallo.swf"の中のムービクリップ(インスタンス名"touten_mc")を拡大させるにはどのようにしたらよろしいでしょうか? ※ 拡大ボタンにいれたスクリプト 単純に on(release) _root.loadpoint.touten_mc._xscale = 110; _root.loadpoint.touten_mc._yscale = 110; } 結果できませんでした よろしくおねがいします。

    • ベストアンサー
    • Flash
  • FlashCS5 ActionScript2.0で3つのボタンを制御し

    FlashCS5 ActionScript2.0で3つのボタンを制御しています。 それぞれインスタンス名はbt1,bt2,bt3です。 動きはマウスオーバーで120%大きくなり、ロールアウトで100%へと戻るものです。 しかし、ロールアウトの動作中に他のボタンに触ると、ロールアウトの動作が中断してしまいます。 なぜでしょうか? //////////////////////////////////////// stop(); sx = 3; var i; //----------- for( i = 1; i < 4; i++){ Nov = "bt" + i; _root[Nov].onRollOver = function(){ Name = this._name; btOverMotion(Name); } _root[Nov].onRollOut = function(){ Name = this._name; btOutMotion(Name); } } //----------- function btOutMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale < 100){ delete this.onEnterFrame; }else{ _root[No]._xscale -= sx*2; _root[No]._yscale -= sx*2; } } } //----------- function btOverMotion(eachNo){ No = eachNo; onEnterFrame = function(){ if(_root[No]._xscale > 120){ delete this.onEnterFrame; }else{ _root[No]._xscale += sx; _root[No]._yscale += sx; } } }

    • ベストアンサー
    • Flash
  • ブラウザに合わせる拡大・縮小する背景画像について

    よろしくお願い致します。 親swfの中にあるmc.bgに外部swfを表示しています。 このmc.bgはブラウザに合わせて拡大・縮小できるように、下記のス クリプトをメインフレームに入れています。 外部swfのひとつに、画像が100%で表示されてから少しづつ拡大して 次の画像へ切り替わるというスライドショーのswfがあるのですが、 (画像が表示・拡大する部分はモーショントゥイーンで制作しています) このswfを親swfに読み込んで表示しているときにブラウザをリサイズすると、外部swfがブラウザに合わなくなり、画像(外部awf)がmc.bgより小 さく表示されてしまいます。 (ブラウザのリサイズをしなければ問題ありませんでした) 外部swfの画像の拡大・縮小に関わらず、常にブラウザに合わせて拡大・ 縮小できるようにするにはどうすればよいのでしょうか? 色々検索したのですが、該当するものがありませんでした。 ほとほと困っております。どうぞよろしくお願い致します。 ※フレームに挿入しているスクリプトです。 ----- R = Stage.height/Stage.width; Stage.scaleMode = "noScale"; Stage.align = "LT"; function bgScale() { w = Stage.width; h = Stage.height; if (w*R>h) { bg._width = w; bg._yscale = bg._xscale; } else { bg._height = h; bg._xscale = bg._yscale; } bg._x = w/2; bg._y = h/2; menuMC._x = w-20; menuMC._y = h-20; } sListener = new Object(); sListener.onResize = function() { bgScale(); }; -----

  • 画像を中央にズームさせるには

    Flash超初心者です。 小さな画像が2、3個横に並んでいて、一つをクリックすると中央にズームし、他の画像をクリックすると先にズームされていた画像がもとの小さな画像に戻るようにしたいです。 http://www.suntory.co.jp/sho-chu/srk/urabanashi.html 過去ログに参考になるものがあり http://oshiete1.goo.ne.jp/kotaeru.php3?q=1444680 少し変更して下記のようにしました。 onClipEvent (load) { yScl = this._yscale; xScl = this._xscale; yPos = this._y; xPos = this._x; } on (rollOver) { this.onEnterFrame = function() { this._yscale *= 1.1; this._xscale *= 1.1; if (this._yscale>=yScl*2.5) { this._yscale = yScl*2.5; this._xscale = xScl*2.5; this.swapDepths(++_root.Depth); } }; } on (rollOut, dragOut) { this.onEnterFrame = function() { this._yscale *= 0.9; this._xscale *= 0.9; this._y += (yPos-this._y)*0.3; this._x += (xPos-this._x)*0.3; if (this._yscale<=yScl) { this._yscale = yScl; this._xscale = xScl; this._y = yPos; this._x = xPos; this.onEnterFrame = null; } }; } でも、これは画像のある同じ場所でズームするので画面の中央でズームさせたいです。 座標を指定すればいいという理屈はわかるのですが、どの部分にどういASを入れたらいいのがわかりません。 また、上記のASでは、ズームしたあとマウスがオブジェクトからはずれると画像がもとの大きさにもどってしまいます。 on (rollOut, dragOut)と入れているからでしょうが、では何を入れたらいいの悩んでしまいましてご相談させていただきました。 どなたかご教授ください。よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • 揺れるスクリプトについて

    こちらで教えていただいたサイトで揺れるスクリプト を勉強していたのですが、 ■を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
  • 複数のムービークリップについて

    毎度すみません。 複数のムービークリップ(以下MC)をステージに時間差でバラバラの位置に登場させたいのですが、最初で行き詰まってしまいましたのでご質問させてください。 5個のMC(1~5)をステージに配置し、インスタンス名をmc1~mc5で振っています。 スクリプトレイヤーに以下の様に記述しています。 ------------ for(i=1;i<5;i++){ var mc = this["mc"+i]; mc.num = i; } mc.num._visible = false; mc.num._alpha = 0; //MCを時間差で任意の位置に表示 var t=0; this.onEnterFrame = function(){ t++; if(t==25){ mc1._visible = true; mc1.onEnterFrame = function(){ this._y = 50; } } if(t==50){ mc2._visible = true; mc2.onEnterFrame = function(){ this._y = 100; } } if(t==75){ mc3._visible = true; mc3.onEnterFrame = function(){ this._y = 150; } } //以降、mc4、mc5は省略 } --------- --------- mc.num._visible = false; mc.num._alpha = 0; --------- の部分で、デフォルト時はmc1~5を非表示にしているつもりが、 最初から表示されてしまいます。 初心者なので、近いフラッシュを見よう見真似で作成しています。 根本的に記述法を間違えておりましたら、恐れ入りますがご指摘ください。 またもっと効率的な方法がありましたら、ご教授いただければ幸いです。 Flash8.0、ActionScript2.0で制作しています。

    • ベストアンサー
    • Flash

専門家に質問してみよう