- ベストアンサー
FlashMXアクションスクリプトでマウスカーソルを残さずに波紋を作成する方法とは?
- FlashMXのアクションスクリプトでマウスカーソルに着いていく波紋を作成する方法について質問です。
- 購入した書籍にはマウスカーソルを動かすとカーソルに着いていき波紋が広がるアクションスクリプトの記述があります。
- しかし、マウスカーソルがステージ上からなくなっても波紋が残ってしまう現象が起きています。この波紋を残さないようにする方法を教えてください。
- みんなの回答 (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」の時は無条件で不可視に、それ以外は・・・という処理になっています。 これでもなお問題が残るとなると、スクリプト以外のところに原因があるのかも知れません。それはちょっと、心当たりがないのですが、、、
その他の回答 (2)
- DPE
- ベストアンサー率85% (666/776)
#1で回答しました、DPEです。 カーソルについていく波紋(スクリプトで複製したインスタンス)は、正常に表示されますでしょうか? スクリプトにエラーがあると、ステージに置いたインスタンスだけが常に表示され、複製されたインスタンスは表示されません。 #1に書いたサンプル(動作確認しましたので、致命的なエラーはないと思います)をコピーして利用して下さっても構わないのですが、サンプルはブラウザで見やすくするために、インデントを全角のスペースで付けています。実際のスクリプトでは、構文の中に全角のスペースが入っているとエラーになりますので、半角のスペースかタブに置き換えて使って下さい。 カーソルについていく波紋が表示され、ステージに置いたインスタンスも常に表示されている場合は、 if (_name != "mc") の辺りに原因があると思います。""の囲み忘れ、不要なスペースの混入、全角・半角の誤り(インスタンス名を半角で付けた場合は半角で書きます)などがないか、確認してみて下さい。また、if 文が入れ子になって複雑ですので、{ } が正しく対応できているかも、合わせてご確認下さい。 ところで、「ムービープレビュー」ではカーソルがステージ外に出たことが正常に判別できていても、パブリッシュしてブラウザやスタンドアロンプレイヤーで見ると、カーソルがステージ外に出ているのに波紋が表示される場合があります。 これはどうやら、Flashは、ムービーの周囲に余白があればカーソルがステージ外に出たことが判別できるが、余白がないと判別できない(ブラウザの、ムービーと本文の境目や、ウィンドウの端にカーソルがあると、座標が上手く検出できない)ことに原因があるようです。 パブリッシュの設定で、HTMLタブの「サイズ」を「パーセント」(幅・高さともに100%)に、「伸縮」を「拡大/縮小なし」に設定すると、「ムービープレビュー」の時と似た表示方法になり、ステージ外に出たことが判別できるようです。 (ただし、この場合はステージ外にあるオブジェクトも全て表示されてしまいます) 別な方法としては、例えば if (_parent._xmouse >= 10 && _parent._ymouse >= 10 && _parent._xmouse <= 540 && _parent._ymouse <= 390 ) のように変更するとステージの周りに10ピクセルずつ余裕を持たせてカーソルの位置を判断するので、カーソルがムービー外に出たことが検出できない現象が発生しにくくなります。 用途に合わせて、いろいろと試してみて下さい。
補足
DPE様、本当に有難う御座います。とても分かり易い解説で勉強不足の私でも良く理解できます。 あれから私自身色々試してて、確かにデフォルトすると、表示が思う様に行かない事を発見し、それも質問させて頂きたく思っていたのです。(それに着いての補足までして頂いて本当になんとお礼を言っていいやら、感謝感激です。) デフォルト後の表示に関しては教えて頂いた記述で出来たのですが、ステージ上のインスタンスに関しては、まだ残ってしまいます。 DPE様が記述して下さったスクリプトをそのままコピーぺーストして動作確認もしてみたのですが(半角・全角検索、置換後)私の記述と同じ動きにになります。 不要な半角スペースがあると上手く動作しないと書かれていますが、 if (_name != "mc") “ if ”“ _name ”“ = ”の後に半角スペースを入れています。その他も同様に記述しているのですが、それ自体に問題があるのでしょうか? アクションスクリプトの書籍を見て独学で記述しているので…とても初歩的な事をお伺いしてすみません。 引き続き宜しくお願い致します。
- DPE
- ベストアンサー率85% (666/776)
マウスカーソルがステージ内にある時は波紋のムービークリップを可視に、ステージ外にある時は不可視にしてはいかがでしょう。 改造するなら、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を利用して下さい。
補足
DPE様、お返事有難う御座います。一人で色々調べても分からずにいたので、とても有り難く思います。 早速なのですが、教えて頂いたとおりに記述を加え、インスタンスをステージ内に配置した所、今度は配置したインスタンスの波紋がずっと出た状態になってしまいます。ステージ外に置いても同じく波紋が表示されたままになります。(root._xmouse、root._ymouse、も試しましたが同症状が出ます。)どうしたら良いでしょう…? たびたびお手数お掛けしますが、宜しくお願い致します。
お礼
DPE様度々有難う御座います。記述して頂いたスクリプトをコピーペーストした所、自分が思う表示がされました。(感動\(^_^)/) やはり私がどこか記述しま違がっているのですね。 教えて頂いたスクリプトを参考に引き続き勉強します。 本当に何度もおつき合い下さって有難う御座いました。