• ベストアンサー

ムービークリップの位置と角度の制御について

スクリプト初心者です。 ●矢印の形をした、ムービークリップ(mc1)がステージ端まで移動すると跳ね返り、跳ね返る方向に向きを変えるスクリプトで悩んでいます・・。 ●ステージサイズ:400×300  シーン1、1フレーム目にmc1配置。 mc1をシーン1に配置の際、角度45度に。 mc1に下記スクリプトを書きました。 onClipEvent(load){     vx=5;     vy=5; } onClipEvent(enterFrame){ this._x += vx; this._y += vy; if (400 < this._x) { vx = -5; this._rotation=-135; } if (300 < this._y) { vy = -5; this._rotation=135; } if (this._x < 0) { vx = 5; this._rotation=-45; } if (this._y < 0) { vy = 5; this._rotation=45; } } ●ステージ端まで行くと矢印(mc1)が跳ね返る事は、出来たのですが、方向(回転角度)がうまく出来ませんでした・・。 自分でも、これでは、回転角度がうまく行かないと分かってはいるのですが・・。 どなたかお分かりの方おられましたら助けてください! よろしくお願いいたします。

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

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

  • ベストアンサー
noname#35109
noname#35109
回答No.2

#1の方の方法でもできると思います。 私は,質問者さまのスクリプトを延長させた場合について回答します。 矢印を上向き(↑)に作図して, その上向き矢印をムービークリップに変換したものとします。 その上向き矢印のムービークリップに書くスクリプトを, 次のようにすればうまく行くと思います(コピペ可能です)。 ---------------------------------------------- onClipEvent (load) { // 右下へ進ませるように変数を設定 vx = 5; vy = 5; // 右下へ向かせる this._rotation = 135; } onClipEvent (enterFrame) { this._x += vx; this._y += vy; // 右端まで行ったとき if (400<this._x) { // 左方向へ進ませる vx = -5; if (vy>=0) { // 下へ進んでいたら左下を向かせる this._rotation = -135; } else { // 上へ進んでいたら左上を向かせる this._rotation = -45; } } // 下端まで行ったとき if (300<this._y) { // 上方向へ進ませる vy = -5; if (vx>=0) { // 右へ進んでいたら右上を向かせる this._rotation = 45; } else { // 左へ進んでいたら左上を向かせる this._rotation = -45; } } // 左端まで行ったとき if (this._x<0) { // 右方向へ進ませる vx = 5; if (vy>=0) { // 下へ進んでいたら右下を向かせる this._rotation = 135; } else { // 上へ進んでいたら右上を向かせる this._rotation = 45; } } // 上端まで行ったとき if (this._y<0) { // 下方向へ進ませる vy = 5; if (vx>=0) { // 右へ進んでいたら右下を向かせる this._rotation = 135; } else { // 左へ進んでいたら左下を向かせる this._rotation = -135; } } } ---------------------------------------------- つまり, 矢印が各端まで行ったときに, 各向きへ向かせる値を定めるには, さらに場合分けが必要だということです。 上のスクリプトで, 行の先頭に 「//」 の付いた行は注釈行(コメントアウト)です。 注釈行を入れた理由は, この回答でスクリプトを説明するためでもありますが, 実際に自分が作る上で頭がこんがらがらないように, メモをしながら作成したという理由もあります。 自分のために注釈行を入れながら, ゆっくり考えて作るとできると思いますよ。

u-chan000
質問者

お礼

以前もお世話になったかと思います!! とても丁寧に教えていただきまして、本当にありがとうございます。 私の説明不足だったかと思います。 mc1矢印→は右向きに作りました。 シーン1に配置する際、 進行方向に向かせる為に45度回転させております。 自分の分かる方法で出来るのであれば、 これで作ってみたいので、アドバイスを参考に いろいろ試してみようとおもいます。 ありがとうございました!!

u-chan000
質問者

補足

すみません。 ●矢印を上向き(↑)に作図して, その上向き矢印をムービークリップに変換したものとします。 上記、ご回答いただいた分を、読み忘れていました。 無事解決いたしました!! ゆっくり考えてメモを取りながら作成していこうと思います。 本当にありがとうございました。

その他の回答 (1)

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.1

とりあえずデフォルト(45°にする前の状態)の矢印の向きが右向きだとして説明します (たぶん現状がそうだと思うので) onClipEvent(load){}内に下記functionを追加記述 function rotChange(ry, rx) { var r = Math.atan2(ry, rx); this._rotation = Math.floor(r*180/Math.PI); } そして、onClipEvent(enterFrame){}のthis._rotation=~と している全ての行を下記に変更 rotChange(vy, vx); もしくはthis._rotation=~を全て消し、最終行に上記を追加でもOKです これでXとYの移動量から自動で角度を求めて変更してくれます

u-chan000
質問者

お礼

回答いただきまして、ありがとうございます。 無事、解決いたしました!! なぜ、出来たのか・・??? 全く分からないので・・(勉強不足でスミマセン・・。。) いただいたスクリプトを元に、理解する様にします。 本当にありがとうございました。

関連するQ&A

  • 慣性の効果がついたマウス追従

    マウス追従の効果で教えてください。 http://www.flashiroha.com/script/as8.htmlの慣性効果付加型のスクリプトは AS2.0で書かれています。 onClipEvent(load) { vx=0; vy=0 } onClipEvent(enterFrame) { vx=vx*0.65+(_root._xmouse-this._x)/a; vy=vy*0.65+(_root._ymouse-this._y)/a; this._x+=vx; this._y+=vy; } これをAS3.0で作成していますが、マウスに追従するどころか大きくステージから離れてしまいます。 どのように記述をしたらいいでしょうか。 my_mc.addEventListener(Event.ENTER_FRAME,onEnterframe); var vx ; var vy ; function onEnterframe(eventObj:Event):void{ vx= my_mc.x*0.65+(stage.mouseX-my_mc.x)/2; vy= my_mc.y*0.65+(stage.mouseY-my_mc.y)/2; my_mc.x+=vx; my_mc.y+=vy; trace(my_mc.x); }

    • ベストアンサー
    • Flash
  • 角度を指定して回転

    スクリプト1 //////////////////////////////////////////////////////////////// onClipEvent (load) { this.x_rotation = 0; d = 1; } onClipEvent (enterFrame) { this._rotation = _rotation += d; if (this._rotation>=90 || this._rotation<=0) { d = -d; } } //////////////////////////////////////////////////////////////// スクリプト2 //////////////////////////////////////////////////////////////// onClipEvent (load) { this.x_rotation = 0; } onClipEvent (enterFrame) { this._rotation = _rotation += 1; if (this._rotation>=90) { this._rotation = -1; } } //////////////////////////////////////////////////////////////// これは、MCが0度~90度の範囲で行ったり来たりするscriptです。 正常に動かないというわけではありませんが、スクリプト2では、90度に達した後いきなり0度に戻ってしまいます。 90度に達したら80度、70度と0度まで戻って欲しいのです。 なぜdを使うのか、スクリプト2ではダメなのかいまいちよく分かりません。 理由と考え方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • AS3 ムービークリップの配置について

    ステージ上に、ムービークリップ mc1 mc2 があるとします。 mc2の24フレーム目の中に、mc3を配置し、mc2の24フレーム目にこんなプログラムを書くとします。 //一秒後に、mc3を移動      mc3.y=260;      mc3.x=MovieClip(parent).mc1.x; すると、mc3の配置は、mc2を基準としたx.y軸で配置されてしまいます。 (すいません。 言葉での説明が難しいです。) 私は、ステージを基準として配置したいのですが、いったいどのように書けばいいですか? ちなみに以下のようにすると私の求めていた結果が得られました。 ステージ上の見えない所に mc3を置いて、mc2の24フレームに      MovieClip(parent).mc3.y=260      MovieClip(parent).mc3.x=mc.x; 正直言葉での説明が難しく、わかりにくいかと思いますが回答よろしくお願いします。

    • ベストアンサー
    • Flash
  • 複数のムービークリップについて

    毎度すみません。 複数のムービークリップ(以下MC)をステージに時間差でバラバラの位置に登場させたいのですが、最初で行き詰まってしまいましたのでご質問させてください。 5個のMC(1~5)をステージに配置し、インスタンス名をmc1~mc5で振っています。 スクリプトレイヤーに以下の様に記述しています。 ------------ for(i=1;i<5;i++){ var mc = this["mc"+i]; mc.num = i; } mc.num._visible = false; mc.num._alpha = 0; //MCを時間差で任意の位置に表示 var t=0; this.onEnterFrame = function(){ t++; if(t==25){ mc1._visible = true; mc1.onEnterFrame = function(){ this._y = 50; } } if(t==50){ mc2._visible = true; mc2.onEnterFrame = function(){ this._y = 100; } } if(t==75){ mc3._visible = true; mc3.onEnterFrame = function(){ this._y = 150; } } //以降、mc4、mc5は省略 } --------- --------- mc.num._visible = false; mc.num._alpha = 0; --------- の部分で、デフォルト時はmc1~5を非表示にしているつもりが、 最初から表示されてしまいます。 初心者なので、近いフラッシュを見よう見真似で作成しています。 根本的に記述法を間違えておりましたら、恐れ入りますがご指摘ください。 またもっと効率的な方法がありましたら、ご教授いただければ幸いです。 Flash8.0、ActionScript2.0で制作しています。

    • ベストアンサー
    • Flash
  • 衝突判定について

    お世話になります。 現在、ある領域内で、球体を動かす処理をしています。 球体は複数ありそれぞれB1・B2・B3としています。 領域の境界を上がL1下がL2右がL3左がL4という具合に それぞれムービークリップを配置してます。 そこで問題なのですが、球体同士がぶつかったら、お互い 別方向に弾けるという処理をしているのですが、3回に一回 位の割合で、別方向に弾けないことがあります。 例えばB1とB2がぶつかった場合、B1は弾けるがB2は変化無く 動いてしまいます。何か良い方法は無いでしょうか? 下記にコードを記載します。よろしくお願いいたします。 onClipEvent(load) //初期値 { vx = 5; vy = 5; a = 1; b = 1; } onClipEvent(enterFrame){ //境界に達した時の処理 for (i=1;i<=4;i++){ kyokai = this.hitTest(_root[ "L" + i ]); if (kyokai==true && i == 1) {vy = 5; b = 1;} if (kyokai==true && i == 2) {vy = -5; b = -1;} if (kyokai==true && i == 3) {vx = -5; a = -1; } if (kyokai==true && i == 4) {vx = 5; a = 1; } } this._x += vx; this._y += vy; //他の球体を監視し、自分の領域に来たら //進行方向を逆にする for (i=1;i<=3;i++){ if(i!=1){ hantei = this.hitTest(_root[ "B" + i ]);} if (hantei==true){ if(a==-1) {vx=5; this._x = this._x+20;} if (b==-1) {vy=5; this._y = this._y+20;} if(a==1) {vx=-5; this._x = this._x-20;} if (b==1) vy=-5; this._y = this._y-20;} } }

  • 特定のムービークリップの上で キラキラがランダムに発生

    お世話になります。 あともう少しのところでうまくいきません。 質問はタイトルの通りなんです。本や、サンプルをいろいろ研究して、 キラキラがランダムに発生するスクリプトを書いたんです。 何がしたいかというと、ムービークリップ「mc_stage」の上だけにキラキラをランダムに発生させたいんです。 sw = mc_stage._width; sh = mc_stage._height; level = 1; this.onEnterFrame = function() { if (Math.random()*10>9) { level++; newname = "Fwks"+level; Fwks.duplicateMovieClip(newname, level); this[newname]._x = Math.random()*sw; this[newname]._y = Math.random()*sh; } if (level>8) { this.onEnterFrame = undifined; } }; この形だと、mc_stageの幅と高さを取得するだけで、座標を取得していません。なので、ステージの左上からmc_stageのwidthとheightの範囲できらきらが発生してしまいます。 どうしたらきちんとmc_stageの上だけでランダムに発生させれますか?ぜひおしえてください!

    • ベストアンサー
    • Flash
  • ムービークリップに配置したボタンを作動させるには?

    Flash初心者のものです。 現在、FLASHで簡単な地図を作成しているのですが スクリプトを記述し、オンマウスによるスライド動作を表現したムービークリップ(インスタンス名:mc_sride)の中にボタン(インスタンス名:btn_a)を配置して、そこをクリックすると 地図の座標が移動するというような動きを実現したいのですが、 なかなかうまくいきません。 メインのムービーにボタンだけを配置した場合はうまく作動するのですが、 それを前述したムービークリップの中に配置すると そのボタンがまったく作動しないのです。 マウスが乗っても反応がありません。 相対パスはきちんと記述しているのですが・・・ どうすればうまく作動するようになるのでしょうか? ちなみにmc_srideのスライド動作のスクリプトは onClipEvent (load) { var div:Number = 0.5; var move_to:Number =730 this._x = 730; } onClipEvent (enterFrame) { this._x += (move_to-this._x)*div; } on (rollOver) { this.move_to -=100 } on (rollOut) { this.move_to +=100 } になります。 ボタンをうまく機能させる方法をご存知の方がもしいらっしゃたら、お手数ですがご指南願います。

    • ベストアンサー
    • Flash
  • ムービークリップの拡大縮小

    MCをクリックしたら拡大・縮小をさせたく、過去の投稿を参考にしながら、以下のscriptを作りました。 onClipEvent(load){ v_orgScale = this._xscale; v_orgX = this._x; v_orgY = this._y; zoomState = false; } on(release, releaseOutside){ zoomState = !zoomState;  this.onEnterFrame = function(){   if( zoomState ){    if(this._xscale >= v_orgScale*2.3){     delete this.onEnterFrame;    }else{     this._xscale *= 1.1;     this._yscale *= 1.1;    }   }else if( !zoomState){    if(this._xscale <= v_orgScale){     this._xscale = v_orgScale;     this._yscale = v_orgScale;     delete this.onEnterFrame;    }else{     this._xscale *= 0.9;     this._yscale *= 0.9;    }   }  }; } ただ、これだとMCの基準点(0,0)に対しての拡大縮小なのでクリックしたポイントが拡大するにつれてどんどんずれていきますよね? これをクリックしたポイントがずれないように拡大縮小する事は可能でしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • ムービークリップがマウスカーソルを追いかけ、マウスカーソルと同じ位置に来たときにムービークリップを変えたい

    以下のようにスクリプトを書いたのですが ムービークリップがマウスカーソルと同じ位置に来ても ムービークリップがフレーム2に移動しません。 ドラゴンクエストVIIIのトップページのFlashのような 表現をしたいのですがうまくいきません。 http://www.square-enix.co.jp/dragonquest/eight/ _mc.onEnterFrame = function() { this._x += ( _root._xmouse - this._x ) / 5; if( this._x == _root._xmouse ) this._mc.gotoAndStop(2); else this._mc.gotoAndStop(1); }; どうすればこの問題を解決することができるのでしょうか。 ご存知の方がおられましたらご回答をよろしくお願いします。

    • ベストアンサー
    • Flash
  • ランダムな動きのスピード制御(Flash)

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