FlashMXアクションスクリプトでマウスカーソルを残さずに波紋を作成する方法とは?

このQ&Aのポイント
  • FlashMXのアクションスクリプトでマウスカーソルに着いていく波紋を作成する方法について質問です。
  • 購入した書籍にはマウスカーソルを動かすとカーソルに着いていき波紋が広がるアクションスクリプトの記述があります。
  • しかし、マウスカーソルがステージ上からなくなっても波紋が残ってしまう現象が起きています。この波紋を残さないようにする方法を教えてください。
回答を見る
  • ベストアンサー

FlashMXアクションスクリプトの記述で分からないのですが…

 現在FlashMXのアクションスクリプトを勉強中で購入した書籍に、マウスカーソルを動かすとカーソルに着いていき波紋が広がるというのがあるのですが、マウスカーソルがステージ上からなくなっても波紋が残ってしまいます。この波紋を残さないようにする記述方法をどなたか教えて下さい。WindowsXP環境です。 onClipEvent (load) { if (_name == "mc") { _visible=false; max = 10; //複製する個数 for (i=0; i<max; i++) { this.duplicateMovieClip(i, 100+i);//複製 } } } onClipEvent (mouseMove) { if (_name == "0") {//一つ目のmcはマウスの座標とする _x = _parent._xmouse; _y = _parent._ymouse; } else {//それ以後は自分の名前から-1引いたインスタンス名の座標を取得する _x = _parent[int(_name)-1]._x; _y = _parent[int(_name)-1]._y; } updateAfterEvent(); } と記述されています。インスタンスmcはシェイプトゥイーンで、円が徐々に大きくなり、消えていくアニメーションを設定しています。

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

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

> デフォルト後の表示に関しては教えて頂いた記述で出来たのですが、・・・ ということは、カーソルについていく波紋は表示されるということで、よろしいですか? そうなると、スクリプトのエラーが原因ではなさそうですね。 スクリプトの中に全角のスペースが入っているとエラーになりますが、半角のスペースとタブは無視されます。ただし、 "" で囲った文字列の中では別で、例えば、 "mc" と " mc " は違う文字列と見なされます。(文字列の中では全角のスペースもエラーにはなりません) インスタンス名が「mc」の場合、  ・if ( _name != "mc" )  → 条件不成立、if 文内のスクリプトは実行されない  ・if ( _name != " mc ")  → 条件成立、if 文内のスクリプトは実行される となります。 #1のスクリプトをコピーしても症状が出るというのは、こちらでは確認できませんでした。(ちなみに当方の環境も、WindowsXP、Flash MXです) 一応、下のようにスクリプトを書き直しましたので、こちらも試してみてください。ちょっと違いますけど、やっていることは同じです。トラブルの原因にならないよう、インデントは付けていません。見辛くて申し訳ありませんが、コピー&ペーストでそのまま使えます。 なお、問題のあるスクリプトはすぐには削除せず、/* と */ で囲んでコメントにし、一時的に無効にしておくと、後で戻したくなった時に便利です。(戻す時は、コメントの記号を削除するだけで簡単に戻せます) onClipEvent (load) { if ( _name == "mc") { _visible=false; max = 10; //複製する個数 for (i=0; i<max; i++) { this.duplicateMovieClip(i, 100+i);//複製 } } } onClipEvent (mouseMove) { //ステージに置いたムービークリップは常に不可視 if ( _name == "mc" ) { _visible = false; } //複製したムービークリップは可視属性と位置を変更する else { //カーソルがステージ内にある場合はmcを可視にし、 //座標を決める if (_parent._xmouse >= 0 && _parent._ymouse >= 0 && _parent._xmouse <= 550 && _parent._ymouse <= 400 ) { _visible = true; //一つ目のmcはマウスの座標とする if (_name == "0") { _x = _parent._xmouse; _y = _parent._ymouse; } //それ以後は自分の名前から-1引いた //インスタンス名の座標を取得する else { _x = _parent[int(_name)-1]._x; _y = _parent[int(_name)-1]._y; } } //カーソルがステージ外にある場合はmcを不可視にする else { _visible = false; } } updateAfterEvent(); } 前回は、インスタンス名が「mc」でなければ、カーソルの位置を見て可視属性と座標を決めていたわけですが、今回は、インスタンス名が「mc」の時は無条件で不可視に、それ以外は・・・という処理になっています。 これでもなお問題が残るとなると、スクリプト以外のところに原因があるのかも知れません。それはちょっと、心当たりがないのですが、、、

shiro_mimi
質問者

お礼

DPE様度々有難う御座います。記述して頂いたスクリプトをコピーペーストした所、自分が思う表示がされました。(感動\(^_^)/)  やはり私がどこか記述しま違がっているのですね。 教えて頂いたスクリプトを参考に引き続き勉強します。 本当に何度もおつき合い下さって有難う御座いました。  

その他の回答 (2)

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

#1で回答しました、DPEです。 カーソルについていく波紋(スクリプトで複製したインスタンス)は、正常に表示されますでしょうか? スクリプトにエラーがあると、ステージに置いたインスタンスだけが常に表示され、複製されたインスタンスは表示されません。 #1に書いたサンプル(動作確認しましたので、致命的なエラーはないと思います)をコピーして利用して下さっても構わないのですが、サンプルはブラウザで見やすくするために、インデントを全角のスペースで付けています。実際のスクリプトでは、構文の中に全角のスペースが入っているとエラーになりますので、半角のスペースかタブに置き換えて使って下さい。 カーソルについていく波紋が表示され、ステージに置いたインスタンスも常に表示されている場合は、  if (_name != "mc") の辺りに原因があると思います。""の囲み忘れ、不要なスペースの混入、全角・半角の誤り(インスタンス名を半角で付けた場合は半角で書きます)などがないか、確認してみて下さい。また、if 文が入れ子になって複雑ですので、{ } が正しく対応できているかも、合わせてご確認下さい。 ところで、「ムービープレビュー」ではカーソルがステージ外に出たことが正常に判別できていても、パブリッシュしてブラウザやスタンドアロンプレイヤーで見ると、カーソルがステージ外に出ているのに波紋が表示される場合があります。 これはどうやら、Flashは、ムービーの周囲に余白があればカーソルがステージ外に出たことが判別できるが、余白がないと判別できない(ブラウザの、ムービーと本文の境目や、ウィンドウの端にカーソルがあると、座標が上手く検出できない)ことに原因があるようです。 パブリッシュの設定で、HTMLタブの「サイズ」を「パーセント」(幅・高さともに100%)に、「伸縮」を「拡大/縮小なし」に設定すると、「ムービープレビュー」の時と似た表示方法になり、ステージ外に出たことが判別できるようです。 (ただし、この場合はステージ外にあるオブジェクトも全て表示されてしまいます) 別な方法としては、例えば   if (_parent._xmouse >= 10 && _parent._ymouse >= 10 &&     _parent._xmouse <= 540 && _parent._ymouse <= 390 ) のように変更するとステージの周りに10ピクセルずつ余裕を持たせてカーソルの位置を判断するので、カーソルがムービー外に出たことが検出できない現象が発生しにくくなります。 用途に合わせて、いろいろと試してみて下さい。

shiro_mimi
質問者

補足

DPE様、本当に有難う御座います。とても分かり易い解説で勉強不足の私でも良く理解できます。    あれから私自身色々試してて、確かにデフォルトすると、表示が思う様に行かない事を発見し、それも質問させて頂きたく思っていたのです。(それに着いての補足までして頂いて本当になんとお礼を言っていいやら、感謝感激です。)  デフォルト後の表示に関しては教えて頂いた記述で出来たのですが、ステージ上のインスタンスに関しては、まだ残ってしまいます。  DPE様が記述して下さったスクリプトをそのままコピーぺーストして動作確認もしてみたのですが(半角・全角検索、置換後)私の記述と同じ動きにになります。    不要な半角スペースがあると上手く動作しないと書かれていますが、 if (_name != "mc") “ if ”“ _name ”“ = ”の後に半角スペースを入れています。その他も同様に記述しているのですが、それ自体に問題があるのでしょうか?  アクションスクリプトの書籍を見て独学で記述しているので…とても初歩的な事をお伺いしてすみません。 引き続き宜しくお願い致します。

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

マウスカーソルがステージ内にある時は波紋のムービークリップを可視に、ステージ外にある時は不可視にしてはいかがでしょう。 改造するなら、onClipEvent (mouseMove) 以降はこのような感じになると思います。 (ステージの大きさは550 x 400とします)    onClipEvent (mouseMove)  {   //複製されたmcのみ、カーソルの位置で   //可視属性と座標を変更する   if (_name != "mc")   {    //カーソルがステージ内にある場合はmcを可視にし、    //座標を決める    if (_parent._xmouse >= 0 && _parent._ymouse >= 0 &&      _parent._xmouse <= 550 && _parent._ymouse <= 400 )    {     _visible = true;     //一つ目のmcはマウスの座標とする     if (_name == "0")     {      _x = _parent._xmouse;      _y = _parent._ymouse;     }     //それ以後は自分の名前から-1引いた     //インスタンス名の座標を取得する     else     {      _x = _parent[int(_name)-1]._x;      _y = _parent[int(_name)-1]._y;     }    }    //カーソルがステージ外にある場合はmcを不可視にする    else    {     _visible = false;    }   }   updateAfterEvent();  } インスタンスにアクションを設定する都合上、予めステージにインスタンスを置いておく必要があります。 ご質問文にあった例は、ステージに置いたインスタンスがロードされた直後、このインスタンスを見えなくし、代わりに、複製した10個のコピーを動かすことで波紋を作っていると思われます。 _visible を変更しないのなら、これでいいのですが、今回はマウスカーソルの位置によって_visible が変化するため、ステージに置かれているオリジナルのインスタンスの _visible が true になると、カーソルの位置に関係なく、このインスタンスが決まった位置に描画されてしまいます。 そこで、上の例では、ステージ上のインスタンスには手を加えず、コピーだけはカーソルの位置によって _visible と座標を変える、という処理を加えています。 なお、波紋のムービークリップが他のムービークリップの子になっている場合、_parent._xmouseや_parent._ymouseは、親になっているムービークリップの原点を基準にしたマウスカーソルの位置となり、ステージ内にあるかどうかが上手く判別できなくなります。このような場合は_parentではなく、_rootの_xmouseや_ymouseを利用して下さい。

shiro_mimi
質問者

補足

DPE様、お返事有難う御座います。一人で色々調べても分からずにいたので、とても有り難く思います。   早速なのですが、教えて頂いたとおりに記述を加え、インスタンスをステージ内に配置した所、今度は配置したインスタンスの波紋がずっと出た状態になってしまいます。ステージ外に置いても同じく波紋が表示されたままになります。(root._xmouse、root._ymouse、も試しましたが同症状が出ます。)どうしたら良いでしょう…?   たびたびお手数お掛けしますが、宜しくお願い致します。

関連するQ&A

  • FlashのActionScript詳しい方お願いします

    Flashで波紋が広がっていくようなムービーのスクリプトなのですが、うまく行きません。 スクリプトが間違っているのだと思うのですが、一応本を参考に同じように入力したつもりですのでどこが間違っているのかが分かりません。 デバックしたら下のようなメッセージが出るのですが、「;」をどこかに入れたらいいのでしょうか? 『 シーン = シーン 1, レイヤー = mouse, フレーム = 1 : 行 9:';' が必要です。 onClipEvnet(mouseMove) { 』 ----------------------------------------- 以下が記述したスクリプトです。 onClipEvent(load){ if(_name== "mc"){ max=10;//複製する個数 for(i=0; i<max; i++){ this.duplicateMovieClip(i,100+i);//複製 } } } onClipEvnet(mouseMove) { if(_name=="0"){//一つ目のmcはマウスの座標とする _x=_parent._xmouse; _y=_parent._ymouse; }else{//それ以降は自分の名前から-1引いたインスタンス名の座標を取得する _x=_parent[int(_name)-1]._x; _y=_parent[int(_name)-1]._y; } updateAfterEvent(); }

  • 移動範囲を指定したい

    マウスを追いかけるMC1の追いかける範囲を指定したいのですがうまくいきません; 細かい指定としては↓ (1)画面の下1/5ぐらいのMC2の中にはMC1は入れない (2)マウスがMC2の中にある時はMC1はy座標は変化なし x座標はマウスを追いかける(つまり、横にしか動かない) (3)マウスがMC2から出てきたら、再びMC1はマウスを追いかける 現状としては ------------------------------------------- onClipEvent (enterFrame) { if (this.hitTest(_root.ki.kusa)){ _x += (_parent._xmouse-_x)*0.1; this._y += 0; }else{ _x += (_parent._xmouse-_x)*0.1; _y += (_parent._ymouse-_y)*0.1; } } ------------------------------------------- これでは、マウスがMC2から出てきた時に、MC1がMC2から離れないという様になってしまうのですがどうすればいいでしょうか??

  • 音のアクションスクリプトについて

    ActionScriptを使った音のスクリプトについて勉強しています。ステージ上に二つの音楽プレーヤーを設置し音楽を流す、という事からはじめてみたのですが、上手く行かずに困っています。 設置した音量+/-ボタンを押すと両方の音量が変わってしまったり、片側を再生している状態で、もう一方を再生すると、もう一方は停止してしまったり(目的的には困らないのですが、本来両方とも再生され音がでているのが本来の姿のようなので)、といった状態です。 何かを間違えた理解と書き方をしていると思うのですが、間違いの指摘や音のアクションスクリプトの書き方についてご教授いただければと思い、質問させていただきました。 複数音楽プレイヤーを設置 という事がしたい場合のアドバイスやご教授をいただきたく思います。 よろしくお願いします。 ステージ  MC01(インスタンス名、I_MC01)   L__MC再生ボタン(インスタンス名、I_saisei)   L__MC音量+ボタン   L__MC再生-ボタン  MC02(インスタンス名、I_MC02)   L__MC再生ボタン(インスタンス名、I_saisei)   L__MC音量+ボタン   L__MC再生-ボタン と二つのシンボルがステージ上に配置し、各MCに再生ボタンと音量+/-ボタンを配置しています。 MC01 onClipEvent (load) {    Hsound_MC01 = new Sound(I_MC01);    Hsound_MC01.attachSound("RS_MC01"); } MC再生ボタン onClipEvent (load) {    Hvol= 50; } on (release) {    _root.I_MC01.Hsound_MC01.stop();    _root.I_MC01.Hsound_MC01.start(); } onClipEvent (enterFrame) {    _root.I_MC01.Hsound_MC01.setVolume(this.Hvol); } MC音量+ボタンon (release) {    if (_root.I_MC01.I_saisei.Hvol<100) {       _root.I_MC01.I_saisei.Hvol += 10; } } と書きました。MC02も同じで、01と02が違うだけです。

    • ベストアンサー
    • Flash
  • アクションスクリプト 

    下記のアクションスクリプトで徐々に目標値へ近づけたいのですが、 うまくいきません。 わかる方よろしくお願いします! btn.onRollOver = function() { clearInterval(myID); for (var i:Number = 1; i<=Max; i++) { if (this.id != i) _root["btn"+i].thumb._y = 0 _root["btn"+i].name_txt._y = 20; _root["btn"+i].frame_mc._y = -2; _root["btn"+i].frame_mc.transform.colorTransform = downColor; } else { this.thumb._y = -5 this.name_txt._y = 15              this.frame_mc._y = -6 } }

    • ベストアンサー
    • Flash
  • スライドバーのアクションスクリプト

    いつも大変お世話になっております。 伸び縮むサイドバーを作っているのですが、伸ばしたまではいいのですが、元の位置に戻すほうがどうもうまくいきません。 以下、途中まで書いたスクリプトです。 ■.recruit_mcがバーの部分になります。 onClipEvent (load) { _root.recruit_mc._x = 859; _root.recruit_mc._y = 272; } onClipEvent (enterFrame) { rec_to_button.onRelease = function() { _root.recruit_mc.onEnterFrame = function() { if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } }; }; } -------------------------------------------------------------- if (_root.recruit_mc._x>=620) { _root.recruit_mc._x -= 10; } の箇所で else を使って、逆の場合をいろいろと書いているのですが どうもうまくいきません。 ボタンを押したら859→620まで移動、またボタンを押したら620→859 まで移動するようにするには、あとどう書き加えればいいですか? ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • ステージにある複数のインスタンスを制御したいです

    ステージに配置してある複数のインスタンスをアクションスクリプトで制御したいです。 インスタンスには「mc0」~「mc9」の連番で名前をつけています。 例えば、それぞれのインスタンスのタイムラインを再生させる指示を与えるとすると、 mc0.gotoAndPlay("main"); mc1.gotoAndPlay("main"); mc2.gotoAndPlay("main"); mc3.gotoAndPlay("main"); ・ ・ ・ mc9.gotoAndPlay("main"); となると思いますが、もっとスマートに書くとするとどんな書き方があるでしょうか? 数がもっと増える可能性があるので、もっと合理的な方法を知りたいです。 アクションスクリプトで生成したインスタンスを動かすには、 for(var i:int=0;i<10;i++){ var mc:MovieClip=new McMC(); addChild(mc); mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } のような感じで動かすのはやったことがあるので 既にステージに直接配置されているインスタンスもfor文で同じように制御できると思い 以下のように試してみましたが… for(var i:int=0;i<10;i++){ var mc:MovieClip; mc.name="mc"+i; mc.x=200+i*50; mc.y=200; mc.gotoAndPlay("main"); } 未定義となってしまいます。 やはり地道に書くしかないのでしょうか? ご教授を宜しくお願い致します。 ※FlashCS4、AS3で作業しています。

    • ベストアンサー
    • Flash
  • マウスを追いかける

    ムービークリップがマウスを追いかけるというようにしたいのですが、追いかけるムービークリップが別のシンボルの中にあると座標がずれるようで、このずれをなくしたいのですがどのようにすればよいのでしょうか? 詳しくは、シーン1にシンボル(ただの図形と追いかけてほしいムービー:mc1)を置いて、mc1に下記のスクリプトを書きました。 -------------------------------------------- onClipEvent (load) { _root.mc1.startDrag(true); x = _root._xmouse; y = _root._ymouse; } onClipEvent (enterFrame) { _x += (_root._xmouse-_x)/4; _y += (_root._ymouse-_y)/4; } --------------------------------------------

    • ベストアンサー
    • Flash
  • 複製したMCを指定した座標へ配置したいのですが

    こんにちは。 初歩的な質問で申し訳ないのですがよろしくお願いします。 attachMoiveでライブラリ内のMCを数十個複製しそれらをステージ内に 配置する際、4x4、6x6といったように均等に数十個配置する事は 出来るのですが均等に配置するのではなく自分の指定した座標に 1つ1つ配置したいのです。 色々調べましたら、自分の配置したい各場所の各座標(x,y)を 配列を使い変数にするのだと思い、自分なりに作ってみましたところ 1つは指定した座標に配置出来たのですが2つ目以降が上手く 配置出来ません。 var i; var num=50; //複製するmcの数 var pos = {x:50, y:100}; //1つ目の指定座標。              //ここで残り49個のmcの座標も指定。 for (i=0; i<num; i++) { _root.attachMovie("mc", "mc"+i, i); var mc_obj = eval("_root.mc"+i); mc_obj._x = pos._x; mc_obj._y = pos._y; } 一応頭の中ではこういうスクリプトを考えてますが多分間違いが あり何かが足りないのだと思います。 var posのところで2つ目以降の座標の指定の仕方と forの中でmc_obj._xとmc_obj._yにどのように50個分指定した 座標へ配置設定をしてやるのかお分かりくださる方がいらっしゃれば ご教授くださいますようよろしくお願いします。

    • ベストアンサー
    • Flash
  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }

  • マウスの移動方向によってマウスカーソルの画像を切り替えたい

    今、マウスカーソルを(右向きの)車の画像にしています。 マウスを右方向に動かしたら、右方向の車の画像にし、逆に左方向に動かしたら左方向の車の画像に切り替える、という処理は可能でしょうか?可能である場合、どのようなスクリプトを書けばよいのでしょうか? マウスのx座標の値の増減で判断する、ということは想像できるのですが、書き方が分かりません。 右向きの車の画像のムービークリップ「car」のインスタンスには、下のスクリプトを記述しています。 onClipEvent (load) { Mouse.hide(); } onClipEvent (mouseMove) { this._x = _root._xmouse; this._y = _root._ymouse; updateAfterEvent(); } バージョンはMXです。 どうかよろしくお願いいたします。

    • ベストアンサー
    • Flash