• 締切済み

立体回転運動 新たにボタンを作って一定角度だけ動かす

お世話になります。 下記のプログラムは3Dのぐるぐる回るプログラムなのですが、 onClipEvent (load) { degree = 0; r = 100; centerx = 150; centery = 100; } onClipEvent (enterFrame) { radian = Math.PI/180*degree; this._x = centerx+r*Math.cos(radian); this._y = centery+r*Math.sin(radian)/2; this._xscale = this._yscale=this._alpha=this._y; degree += 5; } -------------------------------------------------------------------- それで、ここからなのですが、 onClipEvent (enterFrame) {  --省略-- degree += 5;  ↓ のところをまず削除して、新たにボタンを作って、そのボタンを押すと、 押すたびにある一定の角度分だけ円運動するようにしたいのですが、どうしたらいいんでしょうか? 単純にボタンを作って、 そこに on(release) { degree +=5; } と書いてもまともに動きません。 初心者なものなので、よろしくお願いします。 それと、このプログラムはムービークリップに記載されているのですが、出来たらルート画面のレイヤーにactionを作って、そこにスクリプトをまとめて書きたいと思うんですが、どうしたらいいんでしょうか?ムービークリップにインスタント名をつけて、上記のプログラムの前に、 ムービークリップインスタント名.onClipEvent (load) { --省略-- } ムービークリップインスタント名.onClipEvent (enterFrame) { --省略-- } としたら、フィールド名がありませんとエラーが出てしまいます。 長くなってしまいましたが、わかりずらい説明かとは思うのですが、重ねてよろしくお願いします。

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

みんなの回答

  • perse
  • ベストアンサー率74% (113/152)
回答No.3

72°ずつ回転させると停止位置がずれるのは 円運動させる関数EnMove内で degree += 5; としているからです。 フレーム毎に5°ずつ動かしているのでぴったり72°になることはありません。 なので72を割り切ることができる数字にする必要があります。 あわせてその下のnowdeg += 5の部分も直しといてください。 5個のメニューを動かしたいということでちょっとAS書いてみました。 ステージ上にmenu1_mc、menu2_mc、… menu5_mcを配置します。 my_btnはそのままです。 //初期位置変数設定 r = 100; centerx = 150; centery = 100; const = 72; // //初期位置設定 for (var i = 1; i<=5; i++) { var mc = _root["menu"+i+"_mc"]; //move_bln,degreeはそれぞれMC毎に設定します。 mc.move_bln = false; mc.degree = 90+const*i; radian = Math.PI/180*mc.degree; mc._x = centerx+r*Math.cos(radian); mc._y = centery+r*Math.sin(radian)/2; mc._xscale = mc._yscale=mc._alpha=mc._y; } //ボタンを押したとき----------------------------------------- _root.my_btn.onRelease = function() { for (var i = 1; i<=5; i++) { var mc = _root["menu"+i+"_mc"]; if (mc.move_bln) { //trueの時 終了 return false; } else { mc.move_bln = true; } //動かした角度を初期化 mc.nowdeg = 0; //円運動させる関数を呼ぶ mc.onEnterFrame = EnMove; } }; //円運動させる関数-------------------------------------------- function EnMove() { radian = Math.PI/180*this.degree; this._x = centerx+r*Math.cos(radian); this._y = centery+r*Math.sin(radian)/2; this._xscale = this._yscale=this._alpha=this._y; this.degree += 9; //動かした角度 this.nowdeg += 9; //動かした角度が一定値を上回った時 if (this.nowdeg>=_root.const) { //円運動関数を停止 this.onEnterFrame = null; //円運動中ではなくなるのでfalseにする this.move_bln = false; //角度degreeが90°位置にあるものが手前にあるMC if (this.degree%360 == 90) { trace(this); } } } 多少変なトコもありますが参考にでも。

  • perse
  • ベストアンサー率74% (113/152)
回答No.2

>1週目と2週目で軌道が微妙に違ってくる 確認してみましたが軌道は同じ様です(同じところを通ってると思います。) my_mcの止まる位置が違うということでしょうか? #1のASではボタンを押したときに動く一定の角度constの値は50となっていますが 一周は360°なのでこれだと一周するごとにずれてきます。 30、60°のようにキリのいい値にすれば毎回同じ位置に止まります。なので const = 60; としてみてください。 >一番手前に来た時、リンク出来るようにしたい 現在は0°からスタートしているので位置的には右から動きだしています。 これを90°位置からスタートさせれば一番手前で止まるようになると思います。 degree = 90; です。

armstrong-us
質問者

補足

ありがとうございます。 補足なんですけど、my_mcの止まる位置が違うということでしょうか?そうです、確かに30、60といった数字は同じ一難ですけど、72だと違うんですよね??72なら、5回回れば360になるから軌道は同じはずだと思うんですけど、どうして違うんでしょうかね? 一番手前に来た時、リンク出来るようにしたいは、本当は5個のmy_mcを用意して、クルクル回るように出来て、それで一番前のものがリンク出来るようにして、指定されたリンクに飛ばすようにしたいと思っているんですけど。 現状だと難しいですかね?

  • perse
  • ベストアンサー率74% (113/152)
回答No.1

ムービークリップのインスタンス名を my_mc ボタンのインスタンス名を my_btn とします。以下のASをフレームに記述します。 記述するフレーム位置はmy_mc、my_btnがあるフレーム位置と同じか それ以降でなければなりません。 //値の初期化------------------------------------------------ r = 100; centerx = 150; centery = 100; degree = 0 //ボタンを押したときに動く一定の角度 const = 50; //円運動中かどうかを判断するフラグ //true - 円運動中 false - 円運動していない move_bln = false //ボタンを押したとき----------------------------------------- _root.my_btn.onRelease = function() { if (move_bln) { //trueの時 終了 return false; } else { move_bln = true } //動かした角度を初期化 nowdeg = 0; //円運動させる関数を呼ぶ _root.my_mc.onEnterFrame = EnMove; }; //円運動させる関数-------------------------------------------- function EnMove() { radian = Math.PI/180*degree; my_mc._x = centerx+r*Math.cos(radian); my_mc._y = centery+r*Math.sin(radian)/2; my_mc._xscale = my_mc._yscale=my_mc._alpha=my_mc._y; degree += 5; //動かした角度 nowdeg += 5; //動かした角度が一定値を上回った時 if (nowdeg>=const) { //円運動関数を停止 my_mc.onEnterFrame = null; //円運動中ではなくなるのでfalseにする move_bln = false } }

armstrong-us
質問者

補足

遅くなりました。 丁寧に書いていただきありがとうございます。 自分の環境下で試してみました。 一つ思うんですけど、ボタンを押して、一定角度を回転させたとき、1週目と2週目で軌道が微妙に違ってくるのはどうしてなんでしょうか? 最終的には、一番手前に来た時、リンク出来るようにしたいと思っているんですけど。 いろいろ試してみたのですが、どうもうまくいきません。 どうしたらいいんでしょうか? お手数ですが、ご教授いただけないでしょうか?

関連するQ&A

  • 3D回転

    中心に球をを置き、その周りを文字をMovieClipにし 3D風に回転させたいと考えております。 第1フレームに"球"のMovieClipインスタンス(こちらは単にMovieClipに変えないと、swapDepthsの処理が出来ないと思い変換しただけです)、その一つ上のレイヤーに文字のMovieClipインスタンス(こちらは、各文字に前記させて頂きましたスクリプトをMovieClipアクションとして記入)を置いております。そして文字のMovieClipインスタンスを、球の後面に向かう時(入る時)にswapDepthsを使い深度を入れ替えてやると、球の周りを回っている感じになるかなと思ったのですが。。イメージとしましては、某有名テーマパーク(US○)に置かれています地球の周りを、ロゴが回っている感じにしたいのですが。。 asは1.0を使用。 MovieClipには以下のスクリプトを記入。 onClipEvent (load) { degree = 330; r = 100; centerx = 640; centery = 110; } onClipEvent (enterFrame) { radian = Math.PI/180*degree ; this._x = centerx+r*Math.cos(radian); this._y = centery+r*Math.sin(radian)/3; this._yscale = this._xscale=this._alpha=this._y; this.swapDepths(0); degree+= 10; } this.swapDepths(0);を用い、深度を入れ替え表現しようとしたのですが、球に回り込むような表現にはなりません。 と、いいますかMovieClipが点滅してしまうのです。 目指しているのは、MovieClipが某有名テーマパークみたく、球に回り込むような感じです。 どうか、宜しくご教授のほどお願い申し上げます。

    • ベストアンサー
    • 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
  • Flashでボタンをクリックするとフェードイン、フェードアウトする

    アクションスクリプト初心者なのですが、 スクリプトで、ボタンをクリックすると 現在のフレームのムービークリップがフェードアウトしながら、 次のページのムービークリップがフェードインする方法を ご存知でしたら、教えていただけないでしょうか。 ムービークリップがロードしたら、 フェードインするところまでは出来たのですが、 それだと、現在のムービークリップがフェードアウトしないので 困っています。 ムービークリップがロードしたら、 フェードインするスクリプトは、 onClipEvent (load) { _alpha = 0; } onClipEvent (enterFrame) { _alpha += 2; } と記載しております。 どうぞよろしくお願いします。

    • ベストアンサー
    • 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
  • onClipEvent の enterFrameとloadについて

    お世話になります。 幅500pxのステージに形だけのムービークリップを作り、 それに onClipEvent (enterFrame) { if (this._x<=100) { this._x = 250; } else { this._x = 300; } } と記述しました。 ステージ上でムービークリップのx位置を100px以下に配置したところ、300pxに移動してしまいます。 onClipEvent (load)に変更すると250pxになります。 なぜですか? よろしくお願いします。

    • ベストアンサー
    • 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をボタンで制御したい

    4つ前の質問と類似するのですが、四角形のムービークリップを透明度0から100になりつつ移動させたいと思っています。 単純に制御だけするなら onClipEvent (load) { function move() { dx = 10; // x方向の移動量 dy = 0; // y方向の移動量 time = 0; // 時間カウント用 } } onClipEvent (enterFrame) { function move2(){ // 毎フレームごとに移動量を増やしていく dx *= 0.9; dy *= 0.9; // 毎フレームごとに移動量を座標に足しこむ _x += dx; _y += dy; } } で動作したのですが、ボタンを押した時にはじめてこの動きを出したいと思っています。 そこで onClipEvent (load) { function move() { dx = 10; dy = 0; _alpha = 0; time = 0; } } onClipEvent (enterFrame) { function move2(){ dx *= 0.9; dy *= 0.9; _alpha += 5; _x += dx; _y += dy; } } と書いて、ボタンには on(release){ this.player.move(); this.player.move2(); } と書いたところ、それぞれの動きが別になってしまいました。 また、他のボタンを押したときはこれと逆に消えていく動きのあとにこれと同じ動きで四角形が出て来てもらいたいのですがどのようにしたらよろしいでしょうか?どなたかおわかりになる方教えていただきたいです。宜しくお願いします。

    • ベストアンサー
    • Flash
  • Flash ふわふわメニュー ロールオーバーでストップ

    下記サイトを参考にして、ふわふわしたメニューを作成したのですが、ボタン(風船)をロールオーバーしたらストップするようにするにはどうしたらよいのでしょうか?使用しているバージョンはFLASH8です。 http://hfm-kenchan.com/Lesson/log_qa/D0609292.htm  onClipEvent (load) {     this._xscale = this._yscale = 10;     vs = 0;  }  onClipEvent (enterFrame) {     vs = vs*0.8+(100-this._yscale)/5;    this._xscale = this._yscale += vs;  }  onClipEvent (load) {     yy = this._y;     rad = 0;  }  onClipEvent (enterFrame) {     this._rotation += 0.2;    rad += 0.1;    this._y = Math.sin(rad)*10+yy;    if (rad > 10)                        } 

  • ActionScript2.0

    actionscript2.0で作成をしている初心者です 今、ドラッグが可能なムービークリップを作成し、 その下の階層にボタンを作成しています。 onClipEvent (enterFrame){ this.onPress = function(){ドラッグ開始} this.onRelease = function(){ドラッグ終了} this.button1.onPress = function(){ボタン押した処理} [現状] ムービークリップをドラッグ不可能にすれば、ボタンを押すことは可能なのですが、ドラッグ可能にするとボタンが押せなくなります。 ムービークリップのドラッグが可能で、かつムービークリップ階層下のボタンを有効にするためにはどうしたらよいでしょうか。 宜しくお願いします

  • ムービークリップの領域をシェイプの形状にしたい

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

    • ベストアンサー
    • Flash