慣性効果付加型のマウス追従スクリプトのAS3.0化

このQ&Aのポイント
  • AS2.0で書かれた慣性効果付加型のマウス追従スクリプトをAS3.0で作成する方法について教えてください。
  • AS3.0でマウスに追従するマウス追従スクリプトを作成する方法について教えてください。
  • AS3.0のマウス追従スクリプトで、マウスに追従するとステージから大きく離れてしまう問題が発生しています。どのように修正すればよいでしょうか。
回答を見る
  • ベストアンサー

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

マウス追従の効果で教えてください。 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
  • ありがとう数2

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

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

書かれている ActionScript 1.0 のものを "単純に" 書き替えるだけで良いと思いますが。。。 vx=0; vy=0 となっているところをあえて var vx ; var vy ; と書き替えてみたり vx=vx*0.65+…; vy=vy*0.65+…; となっているところをあえて vx= my_mc.x*0.65+…; vy= my_mc.y*0.65+…; と書き替えてみたりと なんだかあえて(わざと)妙な変形をしているようにしか見えませんよ。 ほとんど何も考えず "単純に" 書き替えると次のようになります。 my_mc.addEventListener(Event.ENTER_FRAME,onEnterframe); var vx = 0; var vy = 0; function onEnterframe(eventObj:Event):void { vx=vx*0.65+(stage.mouseX-my_mc.x)/2; vy= vy*0.65+(stage.mouseY-my_mc.y)/2; my_mc.x+=vx; my_mc.y+=vy; }

x_izumin
質問者

お礼

ありがとうございました。

関連するQ&A

  • マウス追従のシンボル重なり位置

    過去ログに該当するのがありませんでしたので質問します。 マウスに追従するシンボルについてですが、mcを3つ用意します。 インスタンス名をそれぞれmy_mc、my_mc1、my_mc2とします。 アクションスクリプトは下記です。 my_mc.addEventListener(Event.ENTER_FRAME,onEnterframe); function onEnterframe(event:Event):void{ my_mc.x+= (stage.mouseX-my_mc.x)/3; my_mc.y+= (stage.mouseY-my_mc.y)/3; my_mc1.x+= (my_mc.x-my_mc1.x)/3; my_mc1.y+= (my_mc.y-my_mc1.y)/3; my_mc2.x+= (my_mc1.x-my_mc2.x)/3; my_mc2.y+= (my_mc1.y-my_mc2.y)/3; } my_mcが追従して、my_mc1とmy_mc2が追いかけます。 my_mc2の重なりが最も手前になってしまいます。私としては一番奥にさせたいのですが 何が原因でこのような現象になるのでしょうか。 環境: FLASH CS3 アクションスクリプト 3.0

    • ベストアンサー
    • Flash
  • ムービークリップの位置と角度の制御について

    スクリプト初心者です。 ●矢印の形をした、ムービークリップ(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
  • マウスに追従するクリップの範囲について

    はじめて投稿します。初心者ですが、よろしくお願い致します。 マウスに追従するムービークリップについて onClipEvent(enterFrame){ this._x += (_root._xmouse - this._x)/10; this._y += (_root._ymouse - this._y)/10; } としておりますが、マウスがムービーの中に入ったときだけ 反応するようにし、マウスがムービーの外にでるとムービー クリップが定位置に戻るようにしたいのですが よい方法がありましたら教えてください。 定位置に戻るときも追従の流れを残したまま、ゆっくり定位置に 戻るようにしたいと思っております。 よろしくお願いいたします。 Win XP : MX 2004

    • ベストアンサー
    • Flash
  • マウス 追従 範囲外

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

  • フレーム上からonClipEvent(load){をしていするには

    onClipEvent(load){ this._x = 0; this._y = 0; } というASをフレーム上から書くときはどの様に書けば良いのでしょうか? _root.MC.onEnterFrame = function(){ の様なかたちでやってみたのですがダメだったのですが、上記の様な事がしたい場合どの様にすれば良いのでしょうか。 ご教授ください。よろしくお願いします。

    • ベストアンサー
    • 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
  • Flashで、ナビゲーションがマウスカーソルに追従し、カーソルに近づくと止まるボタン

    FlashのActionScriptについての質問です。 参考書を見ながらやっていて、 ナビゲーションがマウスカーソルに追従し、カーソルに近づくと止まるボタンを作りたいのですが、 マウスに追従してきません。 _rootタイムラインのムービークリップctr_mcsetに、 onClipEvent (enterFrame) { if (_root.woksctr == true) { this._x += (_parent._xmouse-this._x)/5; this._y += (_parent._ymouse-this._y)/5; } } を記述しました。 ctr_mcsetのタイムラインに、触れると追従が止まるボタンの領域として、 cl_bn02を配置して、クリッカブル表示されないように on (release) { } onClipEvent (load) { this.useHandCursor = false; } を記述しました。 その、cl_bn02のタイムラインに、_up,_over,_downラベルをつくり、 _upには、 stop(); this.hitArea = hit; this.hit._visible = false; _root.worksctr = true; _over,_downには、 _root.worksctr = false; と記述しました。 参考書の通りだと、これでマウスカーソルにナビゲーションが近づくと静止し、 離れると追従するらしいのですが、止まったまま追従してきません。 if (_root.woksctr == true)の、==を、=だけにすると、追従はしてきますが、 ムービークリップの中心点にマウスカーソルがいつもいってしまって、 左右のボタンがうまく押せません。 どこか記述がヘンなのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • マウスを避けるムービークリップ

    マウスが近づくと逃げる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
  • 再生スライダーと連続再生について。

    再生スライダーと連続再生について。 今、複数の外部swfをA.swfの置いたmcによんで 連続再生ができるものを作成しています。(01.swf<-02.swf) 再生スライダーも作ろうと、A.swfにseek_mcとbar_mcを使って設置しました。 つまみのseek_mcをドラッグしたり、動画と一緒に動いたりなどは出来たのですが、 終点までドラッグすると01.swfのはじめに戻ってしまします。 何もしなければ次のファイルをちゃんと再生してくれます。 いろいろ、入力して試してはいるのですが、まったく上手くいきません。 何かいい方法はないでしょうか?? よろしくお願いいたします。 flash8を使っています。 以下は、スライダーの置いてあるフレームに記入したASです。 また、01.swf02.swfに変更はできないので、 A.swfのフレームASを記入してgotoAnd...とenterframe にて連続再生ができるようにしてあります。 var left = this.bar_mc._x+this.seek_mc._width/2; var top = this.bar_mc._y; var right = left+this.bar_mc._width-this.seek_mc._width; var bottom = this.bar_mc._y; this.seek_mc._x = this.bar_mc._x; this.seek_mc._y = this.bar_mc._y; this.seek_mc.onPress = function() { _root.stop(); delete _root.onEnterFrame; this.startDrag(false, _root.left, _root.top, _root.right, _root.bottom); this.onMouseMove = MoveFrame; }; this.seek_mc.onRelease = function() { this.stopDrag();  var p = (this._x-_root.bar_mc._x)/(_root.bar_mc._width-this._width); _root.gamen_mc.gotoAndPlay(Math.floor(_root.gamen_mc._totalframes*p)); _root.onEnterFrame = _root.MoveSeek; delete this.onMouseMove; }; function MoveFrame() { var p = (this._x-_root.bar_mc._x)/(this.bar_mc._width-this._width); _root.gamen_mc.gotoAndStop(Math.floor(_root.gamen_mc._totalframes*p)); } function MoveSeek() { var p = _root.gamen_mc._currentframe/_root.gamen_mc._totalframes; this.seek_mc._x = _root.left+(this.bar_mc._width-this.seek_mc._width)*p; } _root.onEnterFrame = MoveSeek;

    • ベストアンサー
    • Flash

専門家に質問してみよう