• 締切済み

ムービーにマスクをかける

以下のようなムービーにマスクをかけると、 マスクの上にムービーが走ってしまいます。 解決方法はあるでしょうか。 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; }

  • Flash
  • 回答数2
  • ありがとう数3

みんなの回答

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

ご質問文のスクリプトは、管理用の通し番号を割り振りながらムービークリップを複製し、自分に割り当てられた管理番号からムービークリップの位置を決める処理かと思います。 移動の計算と、マスクが効かなくなることとは別の問題です。 移動処理についてはさておきマスクの問題に関しては、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 にマスクをかけると、処理的にはちょっと重くなるかもしれませんが、なるべく少ない変更で解決できる方法として、ご参考までに。

noname#35109
noname#35109
回答No.1

スクリプトを書き直そうかとも思いましたが, いくら,考えても何をされようとしているのかがさっぱりわからなため,書き直せませんでした。 とくにわからないのが cloneNo = ++_root.photoC; の部分です。 このスクリプト,_rootに「photoC」というオブジェクトがなければ動作をしますよね。 cloneNo = ++_root.photoC; や this._y += cloneNo*tate; が無効になるからです。 ---------------------------------------- スクリプトを書き直すのはあきらめて, マスクの件だけお答えしておきます。 上のムービークリップをさらに,ムービークリップの中に入れてください。 すると,_rootに「photoC」がない場合に限って動き,マスクもかかります。 this.duplicateMovieClip(pClone, cloneNo); の部分,現在 cloneNo となっているところには複製されたムービークリップの深度が本来入ります。 マスクは,普通のところにつくってあると思うので,深度は負(-)になっています。 一方,duplicateMovieClipで複製されたオブジェクトは,正(+)の数しかしていできません。 深度とは簡単に言うとレイヤーみたいなものです。 数字が大きくなるほど上のレイヤーと思っていただければ,概念的には良いと思います。 実際に書かれた,オブジェクトは負のレイヤーつまり下のレイヤー,つまり奥のレイヤーに自動的に配置されますが,SWF上で複製されたオブジェクトは,正のレイヤー,つまり上のレイヤー,つまり手前に配置されます。 マスクより手前になります。 ムービークリップに入れてしまうと,そのムービークリップ内での正のレイヤーに複製されるので,マスクより上になることはありません。 -------------------------------------- スクリプトの問題点の根本的解決にはなりませんが, マスクに関しては,そういうわけで,深度の問題です。

参考URL:
http://hakuhin.hp.infoseek.co.jp/main/as/z.html

関連するQ&A

  • ムービープレビューでないと動きません。

    ゲームを途中まで作ったのですが、ムービープレビューで出力したときにしか動きません。 (他のパブリッシュプレビューや実際にサーバーにUPして見ましたがコントロールがききません)問題があれば教えて頂きたく質問させて頂きました。 どうぞよろしく御願いします。 onClipEvent (load) { _root.target._x=100 speed = 0; rot = -90; dx = 0; dy = 0; } onClipEvent (enterFrame) { _root.target.honou.gotoAndStop(1); if(Key.isDown(Key.SPACE)) {speed +=0.8; _root.target.honou.gotoAndStop(2); } if(Key.isDown(Key.LEFT)){ rot -= 3 this._y +=2} if(Key.isDown(Key.RIGHT)) { rot += 3 this._y +=2} else{ this._y =this._y + 3 } dx = Math.cos(rot * Math.PI / 180) * speed; dy = Math.sin(rot * Math.PI / 180) * speed; speed *= 0.9; _x += dx; _y += dy; _rotation = rot; }

    • ベストアンサー
    • Flash
  • ムービークリップの領域をシェイプの形状にしたい

    よろしくお願い致します。 ムービークリップにマウスオーバーするとムービークリップが再生し、マウスアウトすると逆再生するというものを作っています。 ここで、ムービークリップのマウスオーバーする領域を矩形ではなく、見たままの形(シェイプの形状)だけに指定するにはどうすれば良いでしょうか? 現在の状況は、マウスオーバーさせるムービークリップに onClipEvent (load) { this.stop(); } onClipEvent (enterFrame) { if (this.hitTest(_root._xmouse, _root._ymouse, false)) { this.nextFrame(); } else { this.prevFrame(); } } のアクションを書いています。 自分なりに調べたところ、「shapeFlag?というものを使うらしい?」というのは分かったのですが、どう使えば良いのかさっぱり分かりません・・ どなたかご指導頂けないでしょうか。 どうぞよろしくお願い致します。

    • ベストアンサー
    • Flash
  • カウントダウンタイマーについて

    カウントダウンタイマーで、クリックするとカウントダウンが始まる設定のコードを見つけましたが、 クリックをしないでもカウントダウンするためには、 どのコードを削ったら良いのかわかりませんでした。。 ご教授頂けたら幸いです。 onClipEvent (load) { cnt = 5*1000; _root.cnt_flg = false; } onClipEvent (enterFrame) { if (_root.cnt_flg) { ms = cnt-(getTimer()-_root.my_time); m = Math.floor(ms/60/1000); s = Math.floor(ms/1000)-m*60; if (ms>=0) { this.TM.text = "あと "+m+"分 "+s+"秒"; } else { this.TM.text = "TIMEOVER!"; } } } on (release) { if (!_root.cnt_flg) { _root.cnt_flg = true; _root.my_time = getTimer(); } }

    • ベストアンサー
    • Flash
  • 外部swfを読み込んだときだけMouse.hide();させたい。

    よろしくお願いします。 ドキュメント上に空のムービークリップを作り、その中の入れ子のボタンを押すと外部swfを表示するflashを作ったのですが、その外部swf、仮にhoge.swfを読みこんで、そのときだけマウスを隠して(ムービークリップをマウス代わりに)、ボタンで違う外部swf、仮にogeをよみこんだときはマウスを表示させることは可能でしょうか? onClipEvent (enterFrame) { this._x=_root._xmouse; this._y=_root._ymouse; Mouse.hide(); } 上記のスクリプトでマウスを消すと、ogeを読み込んでもマウスが消えっぱなしです。 多分if文を使って if (hogeを読み込んだら){ this._x = _root._xmouse; this._y = _root._ymouse; Mouse.hide(); } //そうでなかったら、 else { Mouse.show(); } みたいな感じなのでしょうが、うまく機能しません・・・。 ご教授お願い致します。

    • ベストアンサー
    • Flash
  • 1フレーム~5フレームまで表示されなくなったのは。。。

    こんにちわ毎回お世話になっております 新しいフラッシュを作ったのですが 前回のフラッシュにしようしたロード画面を 使いまわしました。 ムービークリップ自体には onClipEvent (load) { _root.stop(); } onClipEvent (enterFrame) { if (100 == Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)) { _root.gotoAndPlay(5); } } onClipEvent (enterFrame) { this.gotoAndStop(Math.floor(_root.getBytesLoaded()/_root.getBytesTotal()*100)); } と前回同様記述しました。 しかし今回はロード画面がでず 白紙の画面のまま読み込みが完了し そのままフレーム5に進んでしまっています。 何回もやりなおしたのですが どうしても白紙のまま読み込んでしまいます。 これはFLA自体が破損?したのでしょうか? 非常に困っています。 なにかアドバイスがありましたらお願いいたします。 別のロードムービーを作ったものの 白紙のまま読み込みされました。。。 FLASH8 WIN XP使用です。

    • ベストアンサー
    • Flash
  • scriptを使いまわしたい。

    見よう見まねで下記のようなスクリプトを記述しています。 複数のムービークリップに設定していますが、編集するのにかなり手間がかかります。うまく使いまわす方法はございませんでしょうか…。 また、記述の仕方にも問題等ありましたらご指南ください。。 onClipEvent (load) {  sx_move = Math.floor(Math.random() * -10) - 3;  sy_move = Math.floor(Math.random() * 6) - 3;  s_scale = Math.floor(Math.random() * 40) + 40;  _xscale = (s_scale);  _yscale = (s_scale);  n = 1; } onClipEvent (enterFrame) {  _x += (sx_move);  _y += (sy_move); } on (rollOver) {  mx.behaviors.DepthControl.bringToFront(_root);  this.onEnterFrame = function () {   n += 1;   _x -= (sx_move);   _y -= (sy_move);   if (n < 20) {    _x = (_x + 25) / 1.5;    _y = (_y + 12) / 1.5;    _xscale = (_xscale + 50) / 1.5;    _yscale = (_yscale + 50) / 1.5;   } else if (n < 40) {    stop();   } else if (n < 50) {    _x += 13;    _y += 13;    _alpha -= 20;    _xscale = (_xscale) / 1.2;    _yscale = (_yscale) / 1.2;   } else {    stop();   }  }; }

    • ベストアンサー
    • Flash
  • ASで降らせた雪のマスクの掛け方について。

    下記のサイトのASを使用させていただき、雪の降るFlashを作成したのですが、 参照サイト : http://www.webdesignlibrary.jp/2006/06/flash_snow.php このスクリプトで降らせた雪を、例えば星型の図形をマスクにして、 その範囲内で雪が降るようにしたいと思い、 色々と丸一日掛けて調べたのですが、全く上手く行きません。 とりあえず、色々と調べてみた結果、 【 xxx.setMask 】 を使えば良いのだろうか・・?、、、と言う所までは 行き着いたのですが、スクリプトを、どう改造?してみても、全く思う結果が得られません。 【 _root.setMask 】 で、ステージ全体を、目的の図形MCでマスクする事で、 思う結果に近しいカタチは出来たのですが、_root.setMask でステージをマスクしてしまうと、 例えば、マスク外に何か画像処理を施したくても、マスク外の画像は全て消えてしまいますし、 その画像の大きさ込みでマスクを作成すると、その画像の上にも雪が降ってしまうので、 完全に行き詰ってしまっています。 ASで降らせた雪だけをマスクする方法はありますでしょうか? どなたか、ご存知の方がいらっしゃいましたらば、 是非にご教示願えますと、大変ありがたいです。  何卒よろしくお願い申し上げますm(_ _)m 以下、使用AS ------------------------------------------------ width = 550; height = 400; total = 200; for (var t = 0; t != total; t++) { var mc = _root.attachMovie("snowflake", "snowflake"+t, _root.getNextHighestDepth()); mc._x = (Math.random()*(width+20))-10; mc._y = (Math.random()*(height+20))-10; mc.yspeed = (Math.random()*1.75)+0.25; mc.speed = (Math.random()*3)+2; mc._xscale = mc._yscale=(mc.speed+mc.yspeed)*10; mc.onEnterFrame = function() { var angle = Math.atan2(_root._xmouse-(width/2), _root._ymouse)+1.5707963267949; this._y += Math.sin(angle)*this.speed+this.yspeed; this._x += Math.cos(angle)*this.speed; if (this._x>width+10) { this._x = -10; } else if (this._x<0-10) { this._x = width+10; } if (this._y>height+10) { this._y = -10; } else if (this._y<0-10) { this._y = height+10; } }; } ------------------------------------------------ 【 AS使用環境 】 Adobe Flash CS3, アクションスクリプト2.0

    • ベストアンサー
    • Flash
  • カウントダウンタイマー

    Flashで作成したカウントダウンタイマーの設定時間をJavaScriptで変更することは可能でしょうか? 例) 11秒のカウントダウンをJavaScriptで50秒に変更等。 また、変更する場合、下記コードのどの部分を変更したら良いか ご教授頂けたら幸いです。 onClipEvent (load) { cnt = 11*1000; _root.cnt_flg = false; if (!_root.cnt_flg) { _root.cnt_flg = true; _root.my_time = getTimer(); } } onClipEvent (enterFrame) { if (_root.cnt_flg) { ms = cnt-(getTimer()-_root.my_time); m = Math.floor(ms/60/1000); s = Math.floor(ms/1000)-m*60; if (ms>=0) { this.TM.text = m; this.TS.text = s; } else { _root.gotoAndPlay("timeover"); } } }

  • マウスを追いかける

    ムービークリップがマウスを追いかけるというようにしたいのですが、追いかけるムービークリップが別のシンボルの中にあると座標がずれるようで、このずれをなくしたいのですがどのようにすればよいのでしょうか? 詳しくは、シーン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
  • マウスに追従するクリップの範囲について

    はじめて投稿します。初心者ですが、よろしくお願い致します。 マウスに追従するムービークリップについて onClipEvent(enterFrame){ this._x += (_root._xmouse - this._x)/10; this._y += (_root._ymouse - this._y)/10; } としておりますが、マウスがムービーの中に入ったときだけ 反応するようにし、マウスがムービーの外にでるとムービー クリップが定位置に戻るようにしたいのですが よい方法がありましたら教えてください。 定位置に戻るときも追従の流れを残したまま、ゆっくり定位置に 戻るようにしたいと思っております。 よろしくお願いいたします。 Win XP : MX 2004

    • ベストアンサー
    • Flash

専門家に質問してみよう