actionscript初心者の配置エリアの限定についての質問

このQ&Aのポイント
  • actionscript初心者の方が、ランダムに配置されたオブジェクトを楕円形のエリア内に限定する方法について教えてください。
  • 楕円形のマスクをかける方法ではオブジェクトが欠けてしまっているため、別の方法を探しています。
  • お教えいただけると幸いです。
回答を見る
  • ベストアンサー

atttachmovie で配置エリアの限定

actionscript 初心者です。 for文の中で var x:Number = Math.floor(Math.random()*1000)-500; var y:Number = Math.floor(Math.random()*650)-325; _root.space.attachMovie("btn_mc1", "btn_mc"+i,0-i, init); _root.["btn_mc"+i]._x = x; _root.["btn_mc"+i]._y = y; というスクリプトで、btn_mcというmcをランダムに配置しています。 (このスクリプト、間違っているかもです。すみません) 配置位置は今1000px×650pxのステージ中でランダムになっているのですが これを、このステージいっぱいの楕円形があると仮定して その中にだけ、配置するということをスクリプトでできるでしょうか?? つまり、mcがぼんやりと楕円形に集まっている。。というような状態に したいのです。 楕円のマスクをかける、という方法ですと、mcが欠けてしまい、 見栄えがよろしくないです。。 よろしければ、お教えいただけると、幸いです。 お願いいたします m(__)m

  • Flash
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

> 楕円のマスクをかける、という方法ですと、mcが欠けてしまい、… その マスク のアイデアを使わせてもらって,次のような方法はいかがでしょうか。 まずムービークリップ「space」より下のレイヤーに 適当な色で,ステージ全体に広がる楕円の塗りを描きます。 その塗りを,「基準点」を中央にしたムービークリップに変換して, 「area_mc」というインスタンス名を付けます。 ※ 「基準点」を中央にすると言うよりも,   基準点の座標を「space」と同じ位置にする   という意味です。  ・階層構造   _root    ├space(MC:基準点=ステージ中央)    └area_mc(MC:基準点=ステージ中央) そして, _rootのフレームに次のようなスクリプトを書きます。 ------------------------------------- for (i=1; i<=1000; i++) { var x:Number = Math.floor(Math.random()*1000)-500; var y:Number = Math.floor(Math.random()*650)-325; if (_root.area_mc.hitTest(x+500, y+325, true)) { _root.space.attachMovie("btn_mc1", "btn_mc"+i, i); _root.space["btn_mc"+i]._x = x; _root.space["btn_mc"+i]._y = y; } } ------------------------------------- マスクのアイデアを利用しただけで, 決してマスクを使っているわけではありません。 if文の area_mc.hitTest() で,「area_mc」 と 「点座標」 との当たり判定 をして 「area_mc」 と 「点座標」 が当たっていたら space.attachMovie() で「space」の中に「btn_mc1」を呼びだします。 かなり縮小してありますが 【図↓】。 下の図の場合,水色の楕円を描いたため,楕円が見えてしまっていますが, この塗りの色は後から透明に変えれば良いだけですよね。 ややこしい数学などを使わない簡単な方法です。 この方法だと楕円でなくても, 好きな形で同じことができます 【図↓その他の例】。

kassel
質問者

お礼

先ほど試してみたところ、問題なくできました! ありがとうございました。 てっきり、難しい数式を使って書かなければいけないと 思っていたので。。 考え方って重要ですね~。 ありがとうございました!

kassel
質問者

補足

ご回答いただいていたのに、御礼大変おそくなってしまい、申し訳ありません!今日この手法を実際試してみます。 取り急ぎ、ありがとうございます。また後ほど改めて御礼申し上げます!

関連するQ&A

  • ActionScript3.0について…

    ある課題で下記の条件を満たしたものを制作するというものがありまして、 制作してみたんですが、回答例と異なっていました。 私が制作したものでは、なにか間違っているのか分かりませんので質問させていただきました。よろしくお願いいたします。 ☆☆☆ 条件 ☆☆☆ ★ _mcの移動幅を5~10もしくは-10~-5の範囲になるようにします。 ★ 縦方向、横方向ともにステージの端まで移動したら反転するようにします。 ※ステージ幅は400px、高さは300pxとします。 ※条件ではありませんが、この問題を解くヒントとして、 「移動幅は2分の1の確率で-1を掛ける」と 「2分の1を表す条件式の例としては[ Math.random < 0.5 ]が考えられます。」とあります。 ☆☆☆ 回答例 ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; if (Math.random() < 0.5){ stepX *= -1; } if (Math.random() < 0.5){ stepY *= -1; } _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if (_mc.x >= 400 || _mc.x <= 0){ stepX *= -1; } if (_mc.y >= 300 || _mc.y <= 0){ stepY *= -1; } } ☆☆☆ 私が書いたもの ☆☆☆ var stepX:int = Math.floor(Math.random() * 6) + 5; var stepY:int = Math.floor(Math.random() * 6) + 5; _mc.addEventListener(Event.ENTER_FRAME, xEnterFrame); function xEnterFrame(evt) { _mc.x += stepX; _mc.y += stepY; if(_mc.x > 400 || _mc.x < 0){ stepX *= -1; } if(_mc.y > 300 || _mc.y < 0){ stepY *= -1; } } あくまでもヒントでしたので、私が書く際にはヒントを見ずに書きました。

    • ベストアンサー
    • 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
  • removeChild()についてご教授願います。

    AS3.0の初心者です。 Stratボタン、Stopボタンで以下のスクリプトで表示と非表示を繰返ししたいのですが、 Stopボタンで、単にremoveChild();にしますと、 「#2025: 指定した DisplayObject は呼び出し元の子でなければなりません。」 とエラーとなります。 色々と調べてみたのですが、よく判判りません。 Stopボタンの記述をどの様にすればよいのでしょうか? 初歩的質問で大変恐縮ですが、どうかご教授お願い致します。 [メインスクリプト] var stageH = stage.stageHeight; var stageW = stage.stageWidth; //Stratボタン start.addEventListener(MouseEvent.MOUSE_DOWN,gene); function gene(e:Event):void { for (var i = 0; i < 20; i++) { var mc:Candy = new Candy(); mc.x = Math.random()*stageW + 10; mc.y = Math.random()*stageH + 10; addChild(mc); } } //Stopボタン stop.addEventListener(MouseEvent.MOUSE_DOWN,stp); function stp(e:Event):void { removeChild(mc); この部分がよく判らないのですが、 どの様に記述したら良いのでしょうか? } --------------------------------------- [mc のスクリプト] var mcH:int = this.height; var mcW:int = this.width; var stageH = stage.stageHeight; var stageW = stage.stageWidth; var speedY:uint = Math.random() * 5 + 5; var speedX:uint = Math.random() * 2; addEventListener(Event.ENTER_FRAME,loop); function loop(Event):void { y += speedY; x += speedX; if ( y > stageH ) { y = - mcH; } if ( x > stageW ) { x = - mcW; } } -----------------------------------------

    • ベストアンサー
    • 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)

    スクリーンに小花をいくつか配置し、それがスクリーン上をゆらゆらと動くムービーを作りたいと思っています。 ランダムな動きの方が面白いので、本を見ながら下記の様なアクションスクリプトを小花の形のMCに書きました。 しかし、移動速度がものすごく速く、チラチラするだけで全然キレイじゃありません(ToT) どう言うスクリプトを書き加えれば、スピード制御できるでしょうか? onClipEvent(enterFrame){ this._x+=Math.floor(Math.random()*101-50); this._y+=Math.floor(Math.random()*101-50); }

  • アクションスクリプト 

    下記のアクションスクリプトで徐々に目標値へ近づけたいのですが、 うまくいきません。 わかる方よろしくお願いします! 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
  • クリックしたインスタンスを削除する方法

    windows版FlashCS6で、ActionScript3を使用しております。 どうぞ、よろしくお願いいたします。 最初に、前提をご説明します。 埋め込みアセットクラスBoxをライブラリに準備します。 Boxの中には、50px × 50pxのビットマップが、基準点を中央で配置してあります。 埋め込みアセットクラスWallをライブラリに準備します。 Wallの中には、550px×400pxのビットマップが、基準点を中央で配置してあります。 ステージサイズは550px×400pxです。 タイムラインに、下記のActionScript3を書きます。 var myWall:Wall = new Wall(); myWall.x = 275; myWall.y = 200; addChild(myWall); var myBox:Array = new Array(10); for(var i:int=0 ; i<10 ; i++){ myBox[i] = new Box(); myBox[i].x = Math.random() * 550; myBox[i].y = Math.random() * 400; addChild(myBox[i]); } パブリッシュすると、ステージ上にはmyWallのインスタンスが1個と、myBoxのインスタンスが10個配置されます。 myBoxのインスタンスいずれかをクリックすると、クリックされたmyBoxが削除される(クリックされたmyBoxをremoveChild()し、それの参照を保存していた変数にnullを代入する)ようにするには、どのようにスクリプトを組めば良いでしょうか? 背景のmyWallは、クリックされても削除されないようにしたいです。 ご教示のほど、どうぞ、よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • mcをランダムに並べたい

    winXP、flash8です。 6個のmc(h0~h5)をステージにランダムに並べるようスクリプトを考えています。 ランダムの数R[0]~R[5]までが出ています。 下記のようにx座標とy座標を決め配置したいと思ったのですが うまくいきません。 どこが、違うのか教えてください。よろしく、お願いします。 tx0 = 60; tx1 = 136; tx2 = 212; tx3 = 288; tx4 = 364; tx5 = 440; for (i = 0; i < 6; i++) { num = "_root.h" + R[i]; num._y = 76; num._x = "tx" + [i]; }

    • ベストアンサー
    • Flash
  • attachMovieで表示した複数のMCが一瞬ずつしか表示されません

    attachMovieでMCを複数表示しているのですが、 ランダムに表示したMCが一瞬ずつしか表示されません。 やりたいことは、aaaというMCが横位置と大きさがランダムで表示され、 下にまっすぐ落ちるという動きです。 こちらの記事を参考に作成しました。 http://oshiete1.goo.ne.jp/qa2500105.html -------------------------------------- // 深度の初期値を設定 var dep = 0; // 大きくなる限度を設定 var mag = 80; _root.dep++; _root.attachMovie("aaa", "myMC"+_root.dep, _root.dep); //座標を指定 _root["myMC"+_root.dep]._x = Math.random()*Stage.width; //下に落ちていく _root["myMC"+_root.dep]._y += 10; // 大きさを指定 var my_scale = Math.random()*_root.mag; _root["myMC"+_root.dep]._xscale = my_scale; _root["myMC"+_root.dep]._yscale = my_scale; -------------------------------------- ランダムに表示はできるのですが、すばやく消えて、すぐに次のMCが 表示されてしまいます。 同じ深度に表示されているように見えますが、 _root.dep++; で 深度は変わっているはずなんですが…。 ちなみに stop(); を入れたらひとつだけ表示されましたが 下に落ちていきませんでした…。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • ランダムで画像を表示させるには?

    環境はFlashCS5で、アクションスクリプト3.0を使用しています。 5枚の画像(インスタンス名:mc0~mc4)をランダムで表示させるムービーを制作しているのですが、 下記のスクリプトですと、ランダムで画像が表示されるのですが、画像の切り替えがループになってしまって、次から次へとランダムで画像が切り替わります。フレーム1に下記のスクリプトを記述し、フレーム1にムービーインスタンス「mc0」から「mc4」を配置しています。 function randomShowMC():void { for (var i:int=0; i<5; i++) { this["mc" + i].visible = false; } var rnd:int = Math.floor(Math.random() * 5); this["mc" + rnd].visible = true; } randomShowMC(); var myTimer:Timer = new Timer(3000); myTimer.addEventListener(TimerEvent.TIMER ,function(){randomShowMC()}); myTimer.start(); このスクリプトを改良?改造?して、ランダムの画像が1回のみ…つまり、おみくじみたいに、(mc0~mc4の画像を)ランダムで1回のみ画像を表示させたいのです…表示後の画像が切り替わらずそのままで停止させたいのです。 又は、ムービーインスタンス「mc0」から「mc4」の画像をランダムで表示させ、最初に表示された、その画像で停止させるスクリプトを新規に記述しても構いませんので、ご指導・アドバイスをお願い致します…。 どなたか、解る方がいましたらランダム画像表示で1回表示のみのループしないスクリプトを教えてください。よろしくお願い致します…。

    • ベストアンサー
    • Flash

専門家に質問してみよう