• 締切済み

[Flash]actionscript2.0を用いて歯車を作りたいのですが

Adobe FLASH CS2を使い2つのかみ合った歯車を制作しています。 ドラッグで片方の歯車を回転させると もう片方の方は逆回転になるはずですが、 うまいことactionscriptをかくことができません。 片方はこのようなactionscriptを使っているのですが うまい作り方はないでしょうか。 よろしくおねがいします。 on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //このMCの基準点とマウスとの距離を算出 td0 = Math.sqrt(rx0*rx0+ry0*ry0); //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onEnterFrame を定義 this.onEnterFrame = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; //このMCの移動を計算 }; } on (release, releaseOutside) { //この onEnterFrame を削除 delete this.onEnterFrame; }

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

みんなの回答

  • kikousya
  • ベストアンサー率0% (0/0)
回答No.2

これは動きっぱなしですが 参考になるのでは? ドラッグも同じ要領ですね onClipEvent (enterFrame) { step = _parent.KN.step/(80/10);//歯数を合わせる _rotation = step*-1;//逆回転 _parent._parent.K2 = step; } onClipEvent (load) { step = 0; } onClipEvent (enterFrame) { step += speed; _rotation = step; _parent._parent.K1 = step; if (step>(360*8)-speed) {//初期化 step = 0; } } onClipEvent (load) { step = 0; speed = 10; } 参考までに僕のサイトで紹介しています

参考URL:
http://kikousya.jp/M02_Gallery/G02_watch/index.html
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.1

場合によるので何とも言えません。 2つの歯車は同じ大きさでインスタンスで同じ歯の数を持つムービークリップであったとします。 そうでなければ以下とは全く別物になります。 また仮に,2つの歯車には両方とも歯が20度ずつ18本あるとします。 さらに2つの歯車は左右に真横に並べるものとします。 歯が20度ずつあって左右に真横に並べるという場合には, そのままの角度(_rotation=0)では歯車がかみ合いません。 そこで左右どちらかの歯車のうち一方を10度傾ける必要があります。 その歯が20度ずつ18本ある歯車ムービークリップ2つを 左右に並べて右側の歯車を10度時計回りに回転させて配置し, 左のムービークリップには 「gear_mc1」 右のムービークリップには 「gear_mc2」 というインスタンス名を付けたのが下の図↓です。 この場合は(この場合に限っては), 左の 「gear_mc1」 には次のように書けば良いと思います。 コピペ可能 ------------------------------------------------- on (press) { //このMCの基準点からのマウス座標を取得 rx0 = _root._xmouse-this._x; ry0 = _root._ymouse-this._y; //マウスによる回転の差分を算出 tr0 = (Math.PI/2+Math.atan2(ry0, rx0))*180/Math.PI-this._rotation; //onMouseMove を定義 this.onMouseMove = function() { //現在のMCの基準点からのマウス座標を取得 rx1 = _root._xmouse-this._x; ry1 = _root._ymouse-this._y; //このMCの回転を計算 this._rotation = (Math.PI/2+Math.atan2(ry1, rx1))*180/Math.PI-tr0; // ★親階層の gear_mc2 の回転を このMCの回転+10 にする _parent.gear_mc2._rotation=-this._rotation+10; // 即表示を更新 updateAfterEvent(); }; } on (release, releaseOutside) { //この onMouseMove を削除 delete this.onMouseMove; } ------------------------------------------------- 右の歯車 「gear_mc2」 は,上とほぼ同じですが, // ★親階層の gear_mc2 の回転を このMCの回転+10 にする _parent.gear_mc2._rotation=-this._rotation+10; この部分のみを次のように変えます。 // ★親階層の gear_mc1 の回転を -(このMCの回転)-10 にする _parent.gear_mc1._rotation=-this._rotation-10; これで左の歯車を回すことによって右の歯車が回転し, 右の歯車を回すことによっても左の歯車が回転するものができます。 なお,Flash CS2 というものが売られていたかどうかは知りませんので なるべく書かれていらっしゃるスクリプトをそのまま使うような形で書き替えました。 Flash MX (Flash 6) 以上で使用可能で Flash Player 6 以上で再生可能な ActionScript1.0 です。 > うまい作り方はないでしょうか。 場合によって「どう動かすのか」を考えるしかないでしょう。 全く別のアプローチのしかたとしては, モーショントゥイーンによって2つの歯車がかみ合ったまま回転するアニメーションをムービークリップの中にあらかじめ作成しておいて, マウスの動向によってそのムービークリップ内のフレームを MovieClip.gotoAndStop(**) させても良いかもしれません。  _root    └2つの歯車入りムービークリップ      ├歯車ムービークリップ1      └歯車ムービークリップ2 この方法を使ってもかなり考えないとできませんよ。  

関連するQ&A

  • マウス 追従 範囲外

    マウスを追いかけるMCを以下のように設定しましたが、 MCが動いている範囲外にマウスがいるときは追いかけるのを やめにしたい場合どのように記述すればよろしいでしょうか。  onClipEvent (mouseMove) { if (_root._xmouse >左 && _root._xmouse <右) { this._x = _root._xmouse; } if (_root._ymouse >上&& _root._ymouse <下) { this._y = _root._ymouse; } } 範囲外にマウスがいるときは定位置にmcを表示させるか、 表示を消したいです。 ちなみにmcが動く範囲の指定方法はネット上から探してきました。 別の方法でもっと適した記述があれば教えてください。

  • マウスを避けるムービークリップ

    マウスが近づくと逃げるMCを制作しようとしているのですが、 思うようにいかず悩んでいます。 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z という風に並んだそれぞれのアルファベットのMCに マウスが近づくとある一定の範囲の距離を取り、離れると元の場所に戻る… というふうな動きにしたいのです。 今は、 a_mc.onEnterFrame = function () { X=70;//_rootのAのx座標 Y=211;//_rootのAのy座標 var dx = _root._xmouse-this._x; var dy = _root._ymouse-this._y; var kyori = Math.sqrt(dx * dx+dy * dy); var kakudo = Math.atan2(this._y-_root._ymouse,this._x-_root._xmouse); if(kyori<100){ this._x += kyori * Math.cos(kakudo) * 0.05; this._y += kyori * Math.sin(kakudo) * 0.05; this._x = (this._x * 5+X)/6; this._y = (this._y * 5+Y)/6; } }; と記述してマウスと反対方向の動きをさせていますが、 マウスから離れるという動きではないのです…。 分かりづらい説明ですみませんが、ヒントかなにかあれば教えてください。 制作環境は、CS4で、AS2です。

    • ベストアンサー
    • Flash
  • ActionScript2.0での座標について

    「ActionScript2.0で、_xmouse、_ymouse でマウス座標を得られますが、_xmouse、y_mouseで得られる座標の単位はいくつになるのでしょうか? _xmouse、_ymouseを画面に出力してみると、起動するフォームの場所によっては、マイナスの値になったりするのですが、起動するフォームの場所によって値が相対的に変わるものなのでしょうか?」 以前このような質問をした者です。ご回答もいただき、自分でも調べてみて_root._xmouse や _root._ymouse と書けば、ステージの左上のコーナーが_rootの基準点になることは理解できたのですが、ステージに依存しない座標を取得する方法はありますでしょうか。

    • ベストアンサー
    • Flash
  • onEnterFrameの中止

    お世話になります。 1フレームには下記のようにマウスに追従させています。 function moveCross() { this._x = _root._xmouse; this._y = _root._ymouse; } closs.onEnterFrame = moveCross; 1フレームのメニューから2フレームに進んだ時に、この追従をさせないようにしたいのですが できません。delete onEnterFrameを使えばいいとわかったのですが。 すみませんが、教えてください。

    • ベストアンサー
    • Flash
  • ドラッグ中の回転を止めたいのですが…

    ドラッグができて,なおかつクリックすると90度回転するようにするため,サンプル集を見てムービークリップ(sikaku_mc)に 次のようなアクションスクリプト(以下AS)を書きました。 もともと解説にあったのですが,これだとドラッグしている最中も 回転してしまいます。クリックすると回転しても ドラッグしているときは回転しないようにするためにはどうすればいいでしょうか。 ちなみにこのASはムービークリップ(sikaku_mc)の編集画面のタイムラインに書き込んだものです。 function onPress() { this.startDrag(false); var xm:Number = this._xmouse; var ym:Number = this._ymouse; this._x = _root._xmouse; this._y = _root._ymouse; sikaku_mc._x -= xm; sikaku_mc._y -= ym; this.onEnterFrame = mawasu; this.onMouseMove = updateStage; } function updateStage() { updateAfterEvent(); } function mawasu() { this._rotation += 90; } this.onRelease = this.onReleaseOutside=stopDragMe; function stopDragMe() { this.stopDrag(); delete this.onEnterFrame; delete this.onMouseMove; } ご教授よろしくお願いします。

    • ベストアンサー
    • Flash
  • 線の描画

    使用ソフトはFlashMX2004でMacOSXを使用しています。 線の描画なんですが、他の動きとの関係で マウス位置より85上に線を描画→描画の度に新しいMCを作る→最初に作られたMCから透明になって消える という流れを目指して制作しています。 表現の関係上、btとリンケージ名をつけたボタンを1度押し、離した時に描画位置を指定し、再びボタンを押した時に描画終了という動きをさせたいと思い、以前頂いたサンプルに手を加え var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; }; bt.onRelease = function() { if (osi == 1 &&_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { _root["can"+canvases].moveTo(_root._xmouse, _root._ymouse-85); } } }; というスクリプトをくみましたが描画されません。 私が手を加えた箇所が間違っているのでしょうか。 一応試行錯誤はしてみたんですが解決策が見当たらず・・・。 間違っていましたらご指摘お願いします。 また、解決策がありましたらご教授お願いします。 このスクリプトがてを加える前の状態です。 this.stop(); canNum = 0; var osi = 0; canvases = 0; bt.onPress = function() { canNum++; if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { mX = _root._xmouse; mY = _root._ymouse; osi = 1; } else { osi = 0; } }; bt.onRelease = function() { if (_root._xmouse>=28 && _root._xmouse<=470 && _root._ymouse>=22 && _root._ymouse<=500) { if (osi>0) { _root.createEmptyMovieClip("can"+canvases, canvases); _root["can"+canvases]._alpha = 50; _root["can"+canvases].lineStyle(4, 0xffffff); _root["can"+canvases].moveTo(mX, mY); _root["can"+canvases].lineTo(_root._xmouse, _root._ymouse-85); _root["can"+canvases].onEnterFrame = function() { this._alpha--; if (this._alpha<1) { this.removeMovieClip(); } }; updateAfterEvent(); canvases++; osi = 0; } } }; 長くなってしまい申し訳ありません。

  • 右回り、左回りの判定

    ムービークリップをドラッグし、右回転させている間はAの処理、左回転させている間はBの処理という判定の仕方がわからなくて困っています。 イメージとしてはターンテーブルのようなものです。 現在はムービークリップをドラッグし、右・左回転させるところまでは出来ています。 何かヒント・考え方で結構ですので、ご教授頂けないでしょうか。 下記に現在記述しているスクリプトを記載します。 root階層にインスタンス名"handle"というムービークリップを配置し、Iフレーム目に下記のスクリプトを記述。 handle.onPress = function():Void { if (this.hitTest(_root._xmouse, _root._ymouse, true)) { this.flag = true; } }; handle.onMouseMove = function():Void { if (this.flag == true) { xp = _root._xmouse-this._x; yp = _root._ymouse-this._y; rad = Math.atan2(yp, xp); degree = rad*(180/Math.PI); this._rotation = degree; } }; handle.onMouseUp = function():Void { this.flag = false; }; 宜しくお願いします。

    • ベストアンサー
    • Flash
  • マウスを追いかける

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

    マウスを追いかけるMC1の追いかける範囲を指定したいのですがうまくいきません; 細かい指定としては↓ (1)画面の下1/5ぐらいのMC2の中にはMC1は入れない (2)マウスがMC2の中にある時はMC1はy座標は変化なし x座標はマウスを追いかける(つまり、横にしか動かない) (3)マウスがMC2から出てきたら、再びMC1はマウスを追いかける 現状としては ------------------------------------------- onClipEvent (enterFrame) { if (this.hitTest(_root.ki.kusa)){ _x += (_parent._xmouse-_x)*0.1; this._y += 0; }else{ _x += (_parent._xmouse-_x)*0.1; _y += (_parent._ymouse-_y)*0.1; } } ------------------------------------------- これでは、マウスがMC2から出てきた時に、MC1がMC2から離れないという様になってしまうのですがどうすればいいでしょうか??

専門家に質問してみよう