• ベストアンサー

マウスオーバーやクリック時に拡大表示させたい。

Flash素人の質問で恐縮です。 よく表現されていると思うのですが、ページ上に複数の小さいムービークリップが並べてあって、大きく見たいときに表示されているムービークリップをマウスオーバーした時に(又はクリック時)に拡大表示されるというようなことを実施したいと思っております。 this.xscale = this.yscale = 200 ; 当該のムービーのAction scriptに上記のScriptを記述したのですが、全く無反応です。 どのようにすれば、拡大表示されるのでしょうか?。 また、外部テキストを読み込んで、それをムービークリップに変換して上記の処理につなげるということは出来ますでしょうか?。

  • Flash
  • 回答数7
  • ありがとう数16

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

  • ベストアンサー
  • DPE
  • ベストアンサー率85% (666/776)
回答No.5

> 拡大画像が最前面に表示されるようにするには、どのようにしたら良いか教えて頂けますでしょうか? Flash には深度(Z値)という考え方があります。Zは3次元グラフィックでは奥行き方向の座標を表しますが、2次元のグラフィックでは重ね順の意味で使われることもあります。 Flash ではまさに重ね順の意味で使われていて、深度の小さいものほど上に重なるように描画されます。同じ深度が複数のオブジェクトに割り振られることはなく、同じレイヤーに配置されたオブジェクト同士であっても、深度は別の数値になります。 (同じレイヤーにあるオブジェクトが重なっている場合、どちらかが必ず上になって描画されるのはこのためです) 深度は、普段は数値として確認したり操作したりはできません。しかし、内部では数値で管理されていて、ActionScript ではこの深度を取得したり、深度を入れ替えて重ね順を動的に入れ替えることも可能です。 深度の取得は MovieClip.getDepth 、入れ替えには MovieClip.swapDepths というアクションを使います。 swapDepths は、深度の数値を指定してその深度を占有しているムービークリップと入れ替える方法と、ムービークリップのターゲット名を指定して、そのムービークリップと深度を入れ替える方法があります。 指定のムービークリップを1番上にする方法はいくつか考えられますが、ここではとりあえず、数値を指定して入れ替える方法をご紹介します。 スクリプトは次のように考えます。 まず、4つのムービークリップの深度を調べて、最も上になっているものの深度(つまり、最も小さい深度)を変数に保存しておきます。 ムービークリップの上にマウスカーソルが乗った時、拡大すると同時に、ムービークリップ自身の深度を、変数に保存してある深度(を持つムービークリップ)と入れ替えます。変数には4つの中で1番上になっているものの深度が保存されているのですから、この数値を持つムービークリップと深度を入れ替えると、1番上になって見えるという仕組みです。 4つのムービークリップで最も小さな深度を探す方法ですが。 eval というアクションを使うと、文字列や変数でムービークリップ等のインスタンス名を指定して、操作することができます。例えば、ムービークリップのインスタンス名を clip1 ~ clip4 というように通し番号で付けると、  for( i = 1 ; i <= 4 ; i++ )  {   eval( "clip" + i )._xscale = 200;  } このようにループを利用して、まとめて操作することもできます。今回も eval と for ループを使って、最も小さい深度を探します。 最も小さい深度を保存する変数を1つ、用意します。ここでは仮に、primary_depth という名前にします。 4つのムービークリップのインスタンス名を、先述の clip1 ~ clip4 とし、primary_depth の初期値はとりあえず、clip1 の深度を入れておきます。 残る clip2 ~ clip4 の深度を for ループを使って調べます。if 文で primary_depthの 値と比較して、primary_depth の値よりも小さかった場合は primary_depth の値を書き換えます。すると、 primary_depth には常に小さい方の値が入りますので、ループ終了後には最も小さい深度の値が保持されているというわけです。 スクリプトは、大体、次のようになります。このスクリプトは、タイムラインのフレームに設定してください。 (↓このスクリプトをコピーして利用する場合は、各行頭の全角のスペースを、全て半角のスペースかタブに置き換えてください。このまま使うとシンタックスエラーになります)  //最小の深度を保持する変数  //とりあえず clip1 の深度を初期値としていれておく  primary_depth = eval( "_root.clip1" ).getDepth();  //残りのムービークリップの深度と比較して  //最小の深度を調べる  for( i = 2 ; i <= 4 ; i++ )  {   // clip2 ~ clip4 の深度を取得   temp = eval( "_root.clip" + i ).getDepth();   //深度が小さい場合は最小の深度を更新   if( primary_depth < temp )   {    primary_depth = temp;   }  } あとは#1の方が紹介されているアクションを、各ムービークリップのインスタンスに設定します。 ただし、ロールオーバー時の処理にもう1つ、深度を入れ替える処理を追加してください。 つまり、  //ロールオーバー時に拡大、重ね順を1番上にする  on(rollOver)  {   //拡大処理   this._xscale = 200;   this._yscale = 200;   //重ね順を変更   this.swapDepths( _root.primary_depth );  }  //ロールアウト時に元に戻す  on(rollOut)  {   this._xscale = 100;   this._yscale = 100;  } 変数の代入は、  this._xscale = this._yscale = 200 ; こう書いても文法上は問題ありませんが、スクリプトとしてはちょっと分かりにくいかも知れません。 this._xscale = ・・・などを列挙するのが見にくいのでしたら、with というアクションを使って  with( this )  {   _xscale = 150;   _yscale = 150;   swapDepths( _root.primary_depth );  } と、まとめて書くこともできます。 ActionScript の基本や各アクションの詳細は、市販の解説書や解説サイト・ヘルプ等をご参考になさってください。 長くなってすみませんでした。 不明な点がありましたら、補足してください。 

teddy1014
質問者

お礼

DPEさん、 丁寧に解説して頂き誠にありがとうございます。 LOOP文のような操作がScriptで実装出来る事自体知りませんでした。 早速試してみます。 市販の解説書ですが、Scriptに特化した書籍は「Flash ActionScript Handbook 3rd edition」だけなんです。 良い書籍ですが、Scriptの素材集のような感じで、私のようなScriptを知りたいド素人には向いていないように感じます。お薦めの書籍がありましたらお教えください。 今後とも宜しくご教授ください。

その他の回答 (6)

  • DPE
  • ベストアンサー率85% (666/776)
回答No.7

#5、6です。 #5の件は問題ありませんでしたでしょうか。 #6でも書きました通り、お間抜けな解説をしてしまいまして申し訳ありませんでした。「深度が小さいほど上」と説明しておきながら、スクリプトは「深度が大きいほど上」(正しくはこちら)として組んでいたとは、我ながら矛盾していますね。暑さでボケていたようです ^^; 私が ActionScript を勉強しはじめた頃にお世話になった解説書は、分かりやすくてオススメしたいところなのですが、Flash 5 の頃に刊行された本なので入手も難しいでしょうし、Flash MX や MX 2004 が主流になった今では、少々役不足でしょう。 申し訳ないのですが、最近の解説書についてはよく分かりません。別の質問を立てて回答を募った方が、いい情報が得られると思いますよ。

  • DPE
  • ベストアンサー率85% (666/776)
回答No.6

#5です。 #5の深度の話で、「深度の小さいものほど上」と書いてしまいましたが、「深度の大きいものほど上」の間違いでした。 スクリプトは間違いありません。コメントは違っているのですが、primary_depth と temp を比較して、大きい方を primary_depth に入れてますので。 この場をお借りしまして、お詫び・訂正させていただきます。 お間抜けな勘違いをしまして、大変失礼いたしました。

  • UNAHO
  • ベストアンサー率57% (20/35)
回答No.4

回答にならないかもしれませんが、 フレームの移動で処理ができるならアクションスプリクトでスケールを設定しなくても拡大した画像をそのままタイムラインに設置してはダメなのでしょうか? スケールの値を動的に処理しなければいけないのであればこのては使えませんが、いかがでしょう? それから、もし良かったら教えて欲しいのですが this.xscale = this.yscale = 200 ; この設定のやり方は問題ないのでしょうか? 動作するとしても下記のようにした方がよいと思うのですがどうなんでしょう? this.xscale = 200 ; this.yscale = 200 ;

回答No.3

こんにちは。 >お教え頂きました方法で、あるシンボルをマウスオーバーしたら別のフレームに飛んで、そこに設定してあるシンボルを拡大表示するようなことは可能でしょうか?。 これ自体は可能ですが、その場合はスクリプトが変わってきます。大変失礼ですが、どうもスクリプトの意味自体が分かっていないような気がいます。#1さんのスクリプトのon (rollOver) と言う意味は このシンボルにマウスがrollOverしたら~という処理をしないさいと言う意味になります。 ですので、別のフレームに飛んだ地点でこのスクリプトは解除されてしまいます。 対策としてはフレーム1でマウスがロールオーバーしたらフレーム5に飛ぶ。 フレーム5が表示されたら、X2シンボルを拡大する。 といった流れでいいと思います。 但しフレーム5で記述するスクリプトはどのような処理をしたいかで変わりますけども・・・。

参考URL:
http://www12.plala.or.jp/llink/
teddy1014
質問者

補足

amountainblastさんのご指摘通り、Flashは全くのド素人で色んな意味が理解出来ていないのかもしれません。 #1さんにお教え頂いた通りに実施しようと思いますが、同じレイヤーの同じフレームに、正方形を4等分したような 画像があるのですが、個々にScriptを記述して実行したところ、正しく拡大表示されますが、他の画像が被って表示されます。 拡大画像が最前面に表示されるようにするには、どのようにしたら良いか教えて頂けますでしょうか?。

  • GETSTREET
  • ベストアンサー率18% (14/74)
回答No.2

・何故「onClipEvent」って必要なんでしょうか?。  この場合別に無くても構いません。 ・必ず最初の大きさを記述する必要はありますか?。 この場合別に無くても構いません。 ・拡大されるときの起点は変更出来ますか?。 シンボルの基準点によります。 ・「loadVariables」でダイナミックテキストの変数に外部のテキストを読み込み、 これは不明、わかりません。

teddy1014
質問者

お礼

ありがとうございます。 まずは、当初の目的は達成出来ました。 感謝致します。今後も宜しくお願い致します。 teddy1014

teddy1014
質問者

補足

ありがとうございます。 お教え頂きました方法で、あるシンボルをマウスオーバーしたら別のフレームに飛んで、そこに設定してあるシンボルを拡大表示するようなことは可能でしょうか?。 ・レイヤー1のフレーム1にX1と言うムービーシンボルを配置し、そのシンボルにScriptを記述する。(教えていただいたものを「this」を「XXX」と言うインスタンス名に変更) ・レイヤーBのフレーム5にX2と言うムービーシンボルを配置する。 ・フレーム1,5には「STOP() ;」と言うScriptを記述する。 こうしても全く反応しません。

  • GETSTREET
  • ベストアンサー率18% (14/74)
回答No.1

こんな感じでしょうか? onClipEvent (load) { this._yscale = 100; this._xscale = 100; } on (rollOver) { this._yscale = 200; this._xscale = 200; } on (rollOut) { this._yscale = 100; this._xscale = 100; }

teddy1014
質問者

お礼

早速ありがとうございます。 初歩的な稚拙な質問で恐縮ですが、教えて下さい。 ・何故「onClipEvent」って必要なんでしょうか?。  単にムービーにScriptを記述するだけで実行してくれないのでしょうか?。今までこのようなイベントを使ったことはありません。 ・必ず最初の大きさを記述する必要はありますか?。 ・拡大されるときの起点は変更出来ますか?。  それとも基になるシンボルに依存するのでしょうか?。 ・「loadVariables」でダイナミックテキストの変数に外部のテキストを読み込み、ダイナミックテキストをムービーシンボルに変換し、上記のようにマウスオーバー時に拡大表示することは可能でしょうか?。 どうぞ宜しく御願い致します。

関連するQ&A

  • マウスオーバー(クリック)画像がでズーム

    下記のサイトのように画像にマウスが乗ったら、ズームするようにしたいのですが、どのようなスクリプトを書いているのでしょうか? http://www.bobscube.com/ もしくは下記のサイトのようにクリックすると画像がズームするサイト。スクリプト的には同じ(マウスクリックとマウスオーバーの違い)じゃないかと思うのですが・・・。 http://www.opfa.org/ 単純に画像がズームするだけなら、こちらのサイトに載っていた↓で出来るのですが、上記サイトのように滑らかにズームする方法が分かりません。 onClipEvent (load) { this._yscale = 100; this._xscale = 100; } on (rollOver) { this._yscale = 200; this._xscale = 200; } on (rollOut) { this._yscale = 100; this._xscale = 100; } ご教授宜しくお願い致します。

    • ベストアンサー
    • 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
  • マウスを近づけるとオブジェクトが拡大するメニューなのですが・・・

    アクションスクリプトのサンプルソースは以下です。 (関係がありそうな箇所だけ) サンプルでは、横に並べているメニューなのですが 私は縦にやってみたくて・・・ しかし、このソースのままだとどうしても プレビューすると「ななめ」になってしまうのです。 どこをどう改造すればいいのでしょうか? } 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をクリックしたら拡大・縮小をさせたく、過去の投稿を参考にしながら、以下の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
  • マウスオーバーで画像ズーム(起点取得)

    こんにちは。 マウスオーバーすると画像をズームするスクリプトを考えているのですが、オーバーするときに起点をポインタに合わせるにはどうすればいいのでしょうか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=1444680 こちらの過去ログのスクリプトで、「ズーム」自体はできるのですが、これだと起点が固定になってしまい、画面外にはみ出す部分は見られません。 画面を最大幅に合わせると言うことも考えたのですが、あまり大きな余白が取れず、断念しました。 やりたいのは、例えば200*200の限られた枠があって、そこにデフォルトで200*200の画像があり、マウスを持って行くとマウスポインタが当たっている部分が大きくなるというものです。(枠自体は変わらず、中身だけ大きくなる) *** //ムービークリップ(MC)がロード(表示)されたとき onClipEvent (load) {   //変数ySclとxSclにこのMCの最初の座標を確保   yScl = this._yscale;   xScl = this._xscale; } *** ここの座標をマウスポインタから取得すれば…と思い、いろいろ苦し紛れにやっているのですが、うまく動きません。 ご教授の程、よろしくお願いします。

    • ベストアンサー
    • Flash
  • マウスアウトしているのに、マウスオーバーのままになってしまいます。

    よろしくお願いいたします。 ↓このようなものを作っています。(実際に参考にしているサンプルです。) http://www.oshige.com/flash/mx/swf17/divide_x.html スクリプトは --------------------------------- this.init(); this.onEnterFrame = function() { if (base.hitTest(_root._xmouse, _root._ymouse, false)) { this.rollover(); } else { this.rollout(); } this.resize(); this.setalpha(); }; 以下、function init、function rollout、function rollover、function resize、function setalphaが続きます。 --------------------------------- 最下層のレイヤーに「base」という名前のムービークリップを、ドキュメントと同じサイズ、x=0、y=0で配置。 その上に実際に動かしたいムービークリップが乗っていて、「base」にマウスオーバーしている時にそれぞれのムービークリップの動きをコントロールするというものです。 ですが、マウスを速く動かした時などに、baseからマウスアウトしているにも関わらず、マウスオーバーの状態のままになってしまいます。 色々試してみたところ、実際にbaseやムービークリップが乗っているサイズよりもドキュメントのサイズをかなり大きく取ると解消されたのですが、(サンプルでもそのようになっていました)それではページデザイン上問題があるので・・ スクリプトでどうにかできるものでしょうか? どうぞよろしくお願いいたします。 全然意味が分からない説明になっているかもしれません。不明な点がありましたらご指摘ください。

    • ベストアンサー
    • Flash
  • どうしてロールオーバーを繰り返すと同じオブジェクトが二重に表示されるのですか??

    こんにちは.またまたみなさまのお力をお借りしにきました. 使っているのは「FlashCS/AS1&2」です. アクションフレームに"nu1"というMCをロールオーバー時拡大,ロールアウト時縮小(もとの大きさ)にするASを記述しています.(他にも”nu2”などの同じ機能を持ったMCもあります.) 正常に動くのですが,フレームを何度か移動して,また"nu1"などにロールオーバーしたとき,"nu1"の上に"nu1"がまた再表示されたりしてしまいます.("nu1"はどのフレームにも存在しています.) 原因は震度の問題なのでしょうか?? 震度に関しては以下のASを記述しています. ("top"というMCが存在するアクションフレームに) top.swapDepths(100000); ("nu1"が存在するアクションフレームに) nDepth = 0; nu1.onRollOver = function() { nu1.swapDepths(++_parent.nDepth); nu1._xscale = 120; nu1._yscale = 120; } 他に試したことは,アクションフレームではなく"nu1"のムービークリップアクションフレームにロールオーバー等のASを記述することもしましたが,同じような現象が起こってしまいます. 原因はなんなのでしょうか??? どうか解決していただけないでしょうか?

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

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

  • Flash5で_rootじゃだめthisならOKなんてありますでしょうか。

    いま、FLASH5でローディングバーを作成しているのですが、矩形でバーを作りムービークリップにして、それを_xscaleで伸ばしたいと考えています。そこでテストと言ってはなんですが、例えばそのムービークリップを_rootで幅80%指定(例えばMCと言うムービークリップであれば_root.MC._xscale=80)すると、幅が100%のままで再生されてしまいます。これをthisで定義(this.MC._xscale=80)とすると、これでやっと80%の幅で再生されますが、なんだか矩形のローディングバーだけではなくて画面自体のステージ全体が80%にまで伸縮されて表示されます。このthisの状態で アクションスプリクトを組んで、ループさせてバーを0%の長さから100%の長さまで伸ばしたら、バーが走り回る事態になります。バージョンは、Flash5日本語版でエデュケーション版となっています。なぜこのような現象が起こるのかコメントお願いいたします。

  • マウス以外でクリックするには?

    今プログラミングでゲームを作っています。 マウスを隠して、ムービークリップをマウスと連動させてるのですが、マウスの方向と違う方向を動きます。 例。マウスが右に動けばムービークリップは左に動く。 そこで、今度はそのムービークリップがロールオーバーしたときにアクションが開始されるというものを作りたいのですが、どうすればいいでしょうか。 onRollOverだと、マウスがそのものの上を通ったときですよね。 これを、ムービークリップが動いたときにしたいのです。 わかりにくくてすみませんが、回答お願いします。