• ベストアンサー

回転運動の減速停止方法

こんにちは。以下の動作のアクションスクリプトを教えて 頂きたいと思い、書き込み致しました。 「回転 停止」というキーワードで過去質問を検索しましたが、 見つけることができませんでした。 よろしくお願い致します。 --------------------------------- http://hakuhin.hp.infoseek.co.jp/main/as/move.html#MOVE_04 ↑こちらで紹介されております「円の動きを作りたい 」で、  ある一定の角度(例えば300度とか)まで回転したら停止する  動きを制作したいと思っております。 また、停止する際に、 http://hakuhin.hp.infoseek.co.jp/main/as/move.html#MOVE_02 ↑こちらで紹介されております「減速(摩擦)する動きを作りたい 」  で、減速させて停止する動きが付けられればと思っております。 --------------------------------- 「300度回転してから減速して停止」という動きであれば、 上記サイトで公開されておりますスクリプトの形式でなくても 問題ありません。 お手数ですが、よろしくお願いします。 最後にこちらの環境です。 ------------------------ アクションスクリプト経験 :回転運動、曲線運動などは初めて挑戦。 マシン環境 :WinXP FLASH8 ------------------------ 以上、よろしくお願い致します。

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

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

話が混み合っていて, 何をかかれているのかさっぱりわかりません。 ご質問の本題に三角関数など全く関係しないと思いますが。 したがって, 最初のご質問に関して,シンプルに回答します。 以下は,他のことに関しては全く触れません(シンプルに考えましょう)。 ========================= > 「300度回転してから減速して停止」 その前に, 「何度から減速を開始するのか」も必要だと思います。 ですから,その点も考慮すると, 次のようなスクリプトになります。 ------------------------------------- onClipEvent (load) { // 最初の角度の指定(0=右向き) rot = 0; // 波の幅(円運動の直径)の指定 haba = 50; // 定速運動時の速度の指定 spd = 5; // 減速開始角度の指定(200=左斜め上) rot1 = 200; // 停止する角度の指定(300=右斜め上) rot2 = 300; // 自然に減速する加速度(減速度)の算出 acc = spd/(rot2-rot1); } onClipEvent (enterFrame) { // 角度が減速開始角度未満なら if (rot<rot1) { // 定速運動 rot += spd; } else { // 停止する角度へ向けて減速運動 rot += (rot2-rot)*acc; } rad = rot*Math.PI/180; _x = 200+Math.cos(rad)*haba; _y = 150+Math.sin(rad)*haba; } ------------------------------------- > 上記サイトで公開されておりますスクリプトの > 形式でなくても問題ありません。 と書かれていらっしゃいますが,一応同じ形式にしました。 ですから, Flash 5 以上で作成可能なスクリプトです。 書かれているURLの「円の動きを作りたい」のサンプルのスクリプトを, 上記のように書きかえる(コピペする)だけで使えると思います。 定数を指定する部分は, カスタマイズしやすいように,onClipEvent (load) の方でまとめて指定できるようにしました。 「~の指定」と書いている部分は全て変更可能です。 例えば,  // 減速開始角度の指定  rot1 = 720;  // 停止する角度の指定  rot2 = 900; と指定してもらうと, 2回転(360×2=720)したところで減速を開始し, 2回転半(360×2+180=900)に向けて減速して行きます。 何千億度というような莫大な数値の角度を指定した場合, 数値処理の桁落ちよって誤差が生じて動きが変になる可能性があります。 そのため,オリジナルの「円の動きを作りたい」のサンプルでは,  if(rot > 360) rot -= 360; のように,360度以上に数値が上がらないようにはしていますが, 実際にはそんな角度まで再生することはないと思います。 1000回転(360000度)や10000回転(3600000度)レベルでしたら何度でも全く大丈夫だと思います。 また,角度0度は,右(→向き)です。 全ての角度はその 右0度 を基準とした角度になりますので, その点は注意してください。  

kumakititi
質問者

お礼

sassakunさま この度は、ご解答頂きありがとうございます。 大変シンプルなアクションスクリプト、 また分かり易い説明を頂き、初心者の私でも 良く理解することができました。 始まりの角度や、停止の角度などを色々変えて 試すことができました。 sassakunさまから頂きましたスクリプトを使用 していきたいと思います。 どうもありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • thank001
  • ベストアンサー率25% (18/70)
回答No.4

下の解答ではフレームから書くASを書いたので、インスタンスに書いてしまうと実行されません。下記にI_blueのインスタンスにASを書いた場合のものを書くのでとりあえずコピペで試して見てください。基本的に内容は同じものです。 付け加えとして、I_blueをクリックすると再度同じ動作をするかたちにしています。 onClipEvent(load){ HcenterX = _root.I_red._x; HcenterY = _root.I_red._y; Hkakudo = 1; Hhen_c = 150; } onClipEvent(enterFrame){ Hkakudo = Hkakudo+(300-Hkakudo)/10; Hradian = Math.PI/180*Hkakudo; Hhen_b = Hhen_c*Math.cos(Hradian); this._x = HcenterX+Hhen_b; Hhen_a = Hhen_c*Math.sin(Hradian); this._y = HcenterY-Hhen_a; } on(release){ Hkakudo = 0; } それから、私は初心者の部類ですのでもしかしたら適切なASではないかもしれませんので、sassakunさんが書かれている方を参考にした方がよいかもしれません。 ではでは

kumakititi
質問者

お礼

thank001さま この度は、数回に渡るご解答をありがとうございました。 今回頂きましたアクションスクリプトをMCの「I_blue」に 書き込んだところ、無事動かすことができました。 ただ、「I_blue」は"ムービークリップ"指定しているため、 on(release){ Hkakudo = 0; } を書き込むとエラーとなってしまうので、 そこを削除した結果、無事動かすこととなりました。 今回は、用途の都合により、sassakunさまからご解答頂きました アクションスクリプトで制作したいと思っておりますが、 thank001さまから頂きましたスクリプトも、「I_red」を動かす などして、今後いろいろ応用使用できそうです。 大変参考になりました。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • thank001
  • ベストアンサー率25% (18/70)
回答No.2

途中で投稿してしまったので、付け足しです。 //回転 _root.I_blue.onEnterFrame = function() { // I_blueのenterFrame   Hkakudo = Hkakudo+(300-Hkakudo)/10; // 角度(減速して停止の式   Hradian = Math.PI/180*Hkakudo; // ラディアン値   Hhen_b = Hhen_c*Math.cos(Hradian); // cos式で辺b算出   this._x = HcenterX+Hhen_b; // I_blueのx値を三角関数の辺bを割り当てる   Hhen_a = Hhen_c*Math.sin(Hradian);// sin式で辺a算出   this._y = HcenterY+Hhen_a; // I_blueのy値を三角関数の辺aを割り当てる }

すると、全ての回答が全文表示されます。
  • thank001
  • ベストアンサー率25% (18/70)
回答No.1

減速して停止のアクションは MC._x = MC._x + (300-MC._x)/10; というかたちで行えます。この式をまず理解してください。基本はリンク先と同じです。 次に円運動はリンク先同様に三角関数で円運動ムービーが作れます。 で、円運動の角度の初期値が 0 で最終的に300になればいい訳ですので、三角関数の計算の中で割り当てる角度に上記で書いた減速して停止する式を書き込めば完成です。 下記は円の中心となるI_redというMCを用意し、その周りを300度回転するMCのI_blueというアクションスクリプトです。 //初期値 HcenterX = I_red._x; //円運動の中心地x HcenterY = I_red._y; //円運動の中心地y Hkakudo = 1; //角度の初期値 Hhen_c = 150; //三角関数の辺cであり、円の半径 //回転 _root.I_blue.onEnterFrame = function() { Hkakudo = Hkakudo+(300-Hkakudo)/10; Hradian = Math.PI/180*Hkakudo; Hhen_b = Hhen_c*Math.cos(Hradian); this._x = HcenterX+Hhen_b; Hhen_a = Hhen_c*Math.sin(Hradian); this._y = HcenterY+Hhen_a; }

kumakititi
質問者

補足

thank001さま 分かり易い説明、コメント付きのアクションスクリプト をどうもありがとうございました。 早々試してみたのですが、初歩的なことを理解できず、 動かすことができませんでした。 ↓以下が、試してみたことです。 -------------------------------- ステージ上に、「I_red」「I_blue」というムービークリップを配置し、 「I_red」に、 onClipEvent (load) { //初期値 HcenterX = I_red._x; //円運動の中心地x HcenterY = I_red._y; //円運動の中心地y Hkakudo = 1; //角度の初期値 Hhen_c = 150; //三角関数の辺cであり、円の半径 } onClipEvent (enterFrame) { //回転 _root.I_blue.onEnterFrame = function() { // I_blueのenterFrame Hkakudo = Hkakudo+(300-Hkakudo)/10; // 角度(減速して停止の式 Hradian = Math.PI/180*Hkakudo; // ラディアン値 Hhen_b = Hhen_c*Math.cos(Hradian); // cos式で辺b算出 this._x = HcenterX+Hhen_b; // I_blueのx値を三角関数の辺bを割り当てる Hhen_a = Hhen_c*Math.sin(Hradian);// sin式で辺a算出 this._y = HcenterY+Hhen_a; // I_blueのy値を三角関数の辺aを割り当てる } } のアクションスクリプトを付けました。 その結果、動かすことができませんでした。 可能であれば、もう若干の手解きをお願いすることできますでしょうか? スクリプトに初心者である上、お手数をお掛けしますが、 よろしくお願い致します。

すると、全ての回答が全文表示されます。

関連するQ&A