- 締切済み
ムービーにマスクをかける
以下のようなムービーにマスクをかけると、 マスクの上にムービーが走ってしまいます。 解決方法はあるでしょうか。 onClipEvent(load){ tateSize = 1400; tate = 1400; mY = tateSize/2; tateInt = Math.floor (tateSize/tate); cloneNo = ++_root.photoC; if(cloneNo<=tateInt){ pClone = this._name + cloneNo; this.duplicateMovieClip(pClone, cloneNo); this._y += cloneNo*tate; } } onClipEvent(enterFrame){ if (this._y<(-tate*0.5 - 5)) { this._y += (tateInt+5)*tate; } else if (this._y>(tateSize + tate*0.5 + 5)) { this._y -= (tateInt+1)*tate; } this._y -= (_root._ymouse - mY)/30; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- DPE
- ベストアンサー率85% (666/776)
ご質問文のスクリプトは、管理用の通し番号を割り振りながらムービークリップを複製し、自分に割り当てられた管理番号からムービークリップの位置を決める処理かと思います。 移動の計算と、マスクが効かなくなることとは別の問題です。 移動処理についてはさておきマスクの問題に関しては、Flash MX 以降をお使いでしたら、スクリプトやムービークリップの構造を直さなくても setMask メソッドで何とかなりそうです。 setMask は、ムービークリップの特長を活かしながらマスクとして使えるようにするメソッドです。 Flash の仕様上、マスクレイヤーに配置したムービークリップは単なるの絵(シェイプ)と同じで、 スクリプトで制御できませんし、ムービークリップが持っているタイムラインは動かず、常にフレーム1の絵だけがマスク画像として採用されます。 Flash MX や MX 2004 のマスクレイヤーも、この仕様は変わっていません。 しかし、setMask はムービークリップにマスク機能が追加されたようなものです。スクリプトで制御したり、複数のフレームで作って形が変化するマスク画像としても利用できます。 今回は使いませんが、ムービークリップである以上はスクリプトでの移動や拡大・回転等の変形も可能で、マスクレイヤーでは難しい動くマスクや、ユーザーの操作によって変化するマスクなども簡単に作れます。 Flash に付属のサンプルに setMask による作例があります。興味がありましたら、覗いてみてください。Flash をインストールしたフォルダの、「 samples 」の中にあります。 ( MX と MX 2004 とではフォルダの構成やファイル名が違いますが、” ScriptableMask ”という名前を手がかりにして探してください) まず、マスク画像となるムービークリップを用意します。 今はマスクレイヤーにマスク画像を配置しているかと思います。これを選択し、ムービークリップシンボルに変換してください。 このシンボルのインスタンスがステージに残りますから、インスタンス名を付けます。ここでは仮に、” mask_clip ”とします。 先述の通り、マスクレイヤーに配置したムービークリップはシェイプと同じ扱いになります。 しかし、setMask でマスク画像として使うように定義したムービークリップなら、マスクレイヤーに配置されていてもマスク用のムービークリップとして機能します。 ただ、あえてマスクレイヤーにしておく必要はありませんので、マスクレイヤーは普通のレイヤーに戻しても構いません。 setMaskは、 マスクされるインスタンス名.setMask( マスク画像のインスタンス名 ); このようにして使います。 例えば、ムービークリップ clip を mask_clip でマスクしたい時は、 clip.setMask( mask_clip ); となります。 Flash ではムービー自身も1つのムービークリップとして扱います。通常は” _root ”という名前で識別します。 _root もムービークリップなのですから、普通のムービークリップと同様に setMask メソッドを持っており、マスク画像となるムービークリップを定義できます。 先の例ですと、マスク画像は mask_clip です。 _root.setMask( mask_clip ); このようなスクリプトを、フレーム1に定義してみてください。 描画しただけのオブジェクト(シェイプ)も含めたステージにある全てのオブジェクトに、マスクがかかります。 setMask ではムービークリップの階層単位で処理されるため、深度(オブジェクトの重なり順)は関係ありません。マスク画像が自分(マスクされる画像)より下に配置されていても、マスクはかかります。 今回の例では更に、親の階層が自分の子のムービークリップによりマスクされるという、何とも不思議な構造になっています。 Flash のマスクは、マスク画像と重なっている部分だけが表示される仕組みです。 _root にマスクをかける場合はムービー全体がマスクの対象になるので、表示したいところ全てに画像が重なるようにマスク用のムービークリップを作ってください。 例えばステージのサイズが 550px x 400px でステージ全体を表示するなら、マスクも 550px x 400px の四角形で作り、ステージ全体を覆うように配置します。 普段はこのマスク用のムービークリップを表示する必要ありません。誤って動かしたり、他のオブジェクトを編集する際の邪魔にならないように、レイヤーを非表示・ロックしておくといいでしょう。 レイヤーの表示/非表示・ロックの切り替えは、レイヤー名の横に並んだ2つの●がスイッチになっています。両方ともクリックして、×と錠前のマークが表示されている状態にしてください。レイヤーが非表示になり、ロックがかかります。 _root にマスクをかけると、処理的にはちょっと重くなるかもしれませんが、なるべく少ない変更で解決できる方法として、ご参考までに。
スクリプトを書き直そうかとも思いましたが, いくら,考えても何をされようとしているのかがさっぱりわからなため,書き直せませんでした。 とくにわからないのが cloneNo = ++_root.photoC; の部分です。 このスクリプト,_rootに「photoC」というオブジェクトがなければ動作をしますよね。 cloneNo = ++_root.photoC; や this._y += cloneNo*tate; が無効になるからです。 ---------------------------------------- スクリプトを書き直すのはあきらめて, マスクの件だけお答えしておきます。 上のムービークリップをさらに,ムービークリップの中に入れてください。 すると,_rootに「photoC」がない場合に限って動き,マスクもかかります。 this.duplicateMovieClip(pClone, cloneNo); の部分,現在 cloneNo となっているところには複製されたムービークリップの深度が本来入ります。 マスクは,普通のところにつくってあると思うので,深度は負(-)になっています。 一方,duplicateMovieClipで複製されたオブジェクトは,正(+)の数しかしていできません。 深度とは簡単に言うとレイヤーみたいなものです。 数字が大きくなるほど上のレイヤーと思っていただければ,概念的には良いと思います。 実際に書かれた,オブジェクトは負のレイヤーつまり下のレイヤー,つまり奥のレイヤーに自動的に配置されますが,SWF上で複製されたオブジェクトは,正のレイヤー,つまり上のレイヤー,つまり手前に配置されます。 マスクより手前になります。 ムービークリップに入れてしまうと,そのムービークリップ内での正のレイヤーに複製されるので,マスクより上になることはありません。 -------------------------------------- スクリプトの問題点の根本的解決にはなりませんが, マスクに関しては,そういうわけで,深度の問題です。