Flash ActionScriptで移動するMCを停止・再生する方法とは?

このQ&Aのポイント
  • ActionScriptを使用して、左から右へ移動するMCを作成する方法と、マウスオーバーで停止し、マウスアウトで再生する方法を教えてください。
  • 質問者は、左から右へ移動するMCを作成することはできたが、MCにマウスオーバーしても停止できないため、その後の動作ができない状況にある。
  • 質問者のシナリオでは、左から歩いてきた猫がマウスオーバーで立ち止まり、顔を洗い、マウスアウトすると再び歩き出すという動作を実現したい。
回答を見る
  • ベストアンサー

Flash ActionScript■移動するMCを停止・再生する方法とは?

ActionScirptのみの記載で、 ・左から右へ移動 ・MCにマウスオーバーすると、その場所で停止 ・停止したMCはその場で別のMCに差し替え ・MCからマウスアウトすると、その場所から再生 というものと作りたいと思っております。 シナリオで言えば、 「左から歩いてきた猫が、マウスオーバーで立ち止まり、顔を洗う。 マウスアウトすると顔を洗うのを止めて、右へ歩き出す」 というものです。 「左から右への移動」までは作ることができましたが、 移動するMCにマウスオーバーしても、停止出来ません。 そのため、それ以降の動作もまったく…(滝涙) どうかご存じの方がおいででしたら、ご教示いただきたく。 よろしくお願いします。 制作/動作環境 WinXP,Flash8

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

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

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

#1です。 まだ正常に動きませんか? いくら色んなことに挑戦してみても, #1の補足で書かれているような現象を再現できません。 #1で書いたものは, スクリプト的には FlashMX 以上(Flash Player 6 以上)で動作します。 「Flash 5 用 SWF にパブリッシュしたのだろうか?」 と思い Flash Player 5 の SWF にパブリッシュしてみても, 警告は出るし,パブリッシュされたものはピクリとも動かないしで, #1 の補足に書かれているように 「左から右への移動は大丈夫です。」 という状態にすらなりません。 また, Flash Player 6 以上のパブリッシュだと,無事動作します。 ムービークリップインスタンスではなく, 「グラフィックインスタンスに書き間違えているのだろうか?」 とも思いましたが, グラフィックインスタンスにはそもそもスクリプトが書けない仕様なので, これもちがいますね。 ==================== 赤丸とか青丸と書いたのは, 塗りの色が 赤 や 青 やという色の 「塗り入りの丸い絵」 のことですよ。 新規ドキュメントを作成して, まず,ステージ上に 赤い塗りの丸 (直径5mm~10cm(適当で良い)) を描きます。 その 赤い丸の塗り 自体を選択して, 「修正」→「シンボルに変換」で「ムービークリップ」に変換するのです。 その変換したムービークリップをダブルクリックしてみると, ムービークリップの中に入れます。 ムービークリップの中は当然,1レイヤー1フレームのみで, さっき書いた赤い塗りの丸があるだけのはずです。  ---赤丸ムービークリップ内のタイムライン------               1  □ レイヤー 筆・・・|●|               ↑         赤丸の塗りがステージ上にある  ------------------------------------- そのムービークリップ内のタイムラインを2フレームにして, 2フレーム目をキーフレームにした上で, 2フレーム目の ステージ上にある 赤い塗りの丸 を 青色にバケツツールで塗りかえるのです。  ---赤丸ムービークリップ内のタイムライン------               1  □ レイヤー 筆・・・|●|●|               ↑ ↑               赤 青  ------------------------------------- そして, 「編集」→「ドキュメントの編集」 などで,メインムービーのタイムラインの編集に戻ります。 戻ると当然1レイヤー1フレームのはずです。  ---メインムービーのタイムライン--------------               1  □ レイヤー 筆・・・|●|               ↑      赤丸ムービークリップがステージ上にある  ------------------------------------- ムービークリップ内は フレーム1 の状態が表示されて止まっているはずなので, ムービークリップは赤い丸が見えるだけのはずです。 そのステージ上の赤い丸のムービークリップを選択した状態で, ステージ下にあると思われるアクションパネルを表示させて, そのアクションパネルの白いアクションを書く部分に, #1 で書いたスクリプトの // このムービークリップが登場したとき onClipEvent (load) {  ~略~ // spd ずつ右へ移動 this._x += spd; } までをコピペするのです。 そして, 「制御」→「ムービープレビュー」 をしてみるか, もしくは, 「ファイル」→「パブリッシュ」をしてみるのです。 すると, つまり訂正は全くなしで, #1で赤丸ムービークリップを作成する部分の説明を細かくしただけのことです。 ==================== つまり, どうやったら,#1の補足に書かれているようなことになるのかがわかりません。 このページに書いたスクリプトをコピペしなおしてみても結果は正常に動作します。 #1 ではムービークリップは1回しか作成していませんよ。 階層構造は次の通りです。  _root(メインムービー)   └ 赤い丸ムービークリップ     (↑赤青入れ替わる) 赤い丸のムービークリップが2重になっているということはありませんか?  _root   └ 赤い丸ムービークリップ         └ 赤い丸ムービークリップ           (↑赤青入れ替わる) 赤いムービークリップが2重になっていれば, #1 の補足で書かれているような現象が起こることも考えられます。

azarachi
質問者

お礼

sassakun様 大変ご丁寧にご教示いただきまして、誠にありがとうございます。 赤丸のレイヤー内で、青丸を作って2フレー目というのを勘違いしておりました。 ご指導とおり、再度やってみましたところ動作いたしました。 お陰様で助かりました。本当にありがとうございます。

その他の回答 (1)

noname#35109
noname#35109
回答No.1

> ・停止したMCはその場で別のMCに差し替え と書かれていますが, 本当に 「別のMCに差し替え」 をすると面倒だと思うので, 「右から左に歩く猫」 と,「顔を洗う猫」を, 同じ「猫」というムービークリップ内に作成して, そのムービークリップのタイムラインを gotoAndPlay() や gotoAndStop() で移動させる方が良いのではないでしょうか。 サンプルです。 まず,赤丸をステージ上に描いて,ムービークリップに変換します。 その赤丸ムービークリップをダブルクリックして, 赤丸ムービークリップ内のタイムラインの フレーム2 を選択して, 「キーフレームの挿入」で 2フレーム にします。 そして,フレーム2 をキーフレームに変換して, フレーム2 の赤丸を青丸に塗りかえます。  ---赤丸ムービークリップ内のタイムライン------               1  □ レイヤー 筆・・・|●|●|               ↑ ↑               赤 青  ------------------------------------- それで,メインムービーのタイムラインの編集に戻ります。 戻ると,赤丸ムービークリップがそのままあると思いますから, そのムービークリップ自体に次のように書きます。 -------------------------------------- // このムービークリップが登場したとき onClipEvent (load) { // とりあえずストップ(※不要かも) this.stop(); // スピードの初期値を指定(可変) spd = 5; } // // このムービークリップにマウスオーバーしたとき on (rollOver) { // スピードの値を 0 にする spd = 0; // フレーム2 へ(場合によってはgotoAndPlay) this.gotoAndStop(2); } // // このムービークリップからマウスアウトしたとき on (rollOut, dragOut) { // スピードの値を 5 にもどす spd = 5; // フレーム1 へ(場合によってはgotoAndPlay) this.gotoAndStop(1); } // // 1フレーム進む時間ごとに毎回実行 onClipEvent (enterFrame) { // spd ずつ右へ移動 this._x += spd; } -------------------------------------- これで, ムービープレビューなどしてもらうと動作確認ができると思います。 ムービークリップ内は 2フレーム しかありませんが, それぞれ複数フレームを用意して, 「右から左に歩く猫」 と「顔を洗う猫」のアニメーションを作成して, それぞれのフレームに gotoAndPlay しても良いと思います。                 歩く猫   顔を洗う猫   □ レイヤー 筆・・・|●//////[]|●/////[]| この場合は, ムービークリップ内は複数フレームありますから,最初の,  // とりあえずストップ(※不要かも)  this.stop(); は不要となります。 また, ムービークリップ内は 2フレーム のままで, つまりスクリプトも上のままで, フレーム1 には「歩く猫」アニメのムービークリップ, フレーム2 には「顔を洗う猫」アニメのムービークリップを用意しても良いと思います。 それと, > 移動するMCにマウスオーバーしても、停止出来ません。 ということですが, 上記スクリプトの場合,常に猫は,  // spd ずつ右へ移動  this._x += spd; で 変数spd に値ずつ右へ動かしているのですが, その 変数spd の値を マウスオーバー や マウスアウト によって変えているので, 止まったり動いたりします。 当然他の方法も多数ありますが, 1つの簡単な方法例です。

azarachi
質問者

補足

sassakun様 早々のご回答を頂き、どうもありがとうございます。 ご教示の通り、赤丸と青丸を作成しスクリプトをそのまま貼り付けてみました。 ところが、赤丸と青丸が点滅するばかりで、マウスオーバーも動作しませんでした(泣) ちなみに、左から右への移動は大丈夫です。 どうしたものか、さっぱりです。。。 お手数をお掛けしますが、再度ご教示くださいますようお願いします。

関連するQ&A

  • ComboBoxでmcを移動させるには

    お世話になります。 コンポーネントのComboBoxでリストから項目を選択して、一つのムービークリップを等間隔で移動させたいと思っています。 例えば、 +10.0を選択するとmcが右に1300px移動 +3.0を選択するとmcが右に390px移動 +1.0を選択するとmcが右に130px移動 0はデフォルト -1.0を選択するとmcが左に130px移動 -3.0を選択するとmcが左に390px移動 -10.0を選択するとmcが左に1300px移動 というような感じに作るにはどうしたら良いでしょうか? なるべく簡単な方法でできるとありがたいです。 どうぞ宜しくお願いいたします。 環境:Windows XP、Flash Professional 8

  • Flash(ActionScript3.0)

    Flash(ActionScript3.0)でゲーム制作を行っています。 ActionScriptもFlashも最近初めて触れた初心者で、分からないことがたくさん湧いてきて困っています。 よろしければご回答お願い致します。 インスタンスをドラッグすることができる、という要素と、 インスタンスをクリックすると45度回転する、という要素を同時に入れたいのですが、 同時にプログラムを組むとドラッグだけをすることができず、 どうしてもドラッグ後に45度回転してしまいます。 (プログラムのソースはネットから拾ってきたものです)。 どうすればドラッグと回転を分けることができるのでしょうか。 プログラム自体は以下のように組みました。 ご回答いただければ嬉しいです。 よろしくお願い致します。 //インスタンスの回転プログラム mc1.addEventListener(MouseEvent.CLICK, kaiten); function kaiten(event:MouseEvent) { mc1.rotation += 45; } //インスタンスのドラッグプログラム //インスタンスの0点からのマウス座標用変数 var mc1X:int; var mc1Y:int; //マウスがインスタンスを押したらsec1開始 mc1.addEventListener(MouseEvent.MOUSE_DOWN,sec1); //sec1 マウスダウン座標確認、sec2開始 function sec1(event:MouseEvent):void { mc1X = event.localX; mc1Y = event.localY; addEventListener(MouseEvent.MOUSE_MOVE,sec2); } //sec2 インスタンス移動 function sec2(event):void { mc1.x = mouseX-mc1X; mc1.y = mouseY-mc1Y; //低FPSマウス移動スムーズ対応 event.updateAfterEvent(); } //マウスが離れたらsec3開始 stage.addEventListener(MouseEvent.MOUSE_UP,sec3); mc1.addEventListener(MouseEvent.MOUSE_OUT,sec3); //sec3 sec2停止 function sec3(event):void { removeEventListener(MouseEvent.MOUSE_MOVE,sec2); }

  • FLASH/一定時間停止後、再生されるscript

    flash CS4/ActionScript3.0にてサイトローテーションバナーを制作しております。 ムービークリップ「btn1_mc」をクリックするとフラッグ「scene1」を再生し、 「btn1_mc」にポインタが乗った時は一定時間停止し、再生されるという動きを作りたいのですが、初心者のため、うまくActionScriptが書けません。 setTimeout関数を使えば良いということはわかったのですが… 下記コードに書き加え、実装する方法を教えていただければ助かります。 よろしくお願いします。 btn1_mc.addEventListener(MouseEvent.CLICK,btn1Click); btn1_mc.addEventListener(MouseEvent.ROLL_OVER,btn1Over); btn1_mc.addEventListener(MouseEvent.ROLL_OUT,btn1Out); btn1_mc.buttonMode=true; function btn1Click(evt:MouseEvent):void{ gotoAndPlay("scene1"); } function btn1Over(evt:MouseEvent):void{ gotoAndStop("scene1"); btn1_mc.gotoAndStop(2); } function btn1Out(evt:MouseEvent):void{ gotoAndPlay("60"); btn1_mc.gotoAndStop(1); }

  • ActionScript■MC内の動作はシーンで無効?

    左から右へ移動するもの(http://oshiete1.goo.ne.jp/qa3031497.html)を「MC内で動くMC」ように改造しました。 しかし、 MC内部が動いたままシーンで止まっているか、 MC内部の動きのないMCがシーンで動くか のどちらかです(泣) 別の「動くMC」を止まったときに差し替えたいのに、これでは どちらも出来ない状態で、すこぶる困っております。 何が悪いのか、また「また」分からなくなり呆然としております。 ご存じの方、お助けください。よろしくお願いします。

    • ベストアンサー
    • Flash
  • _x,_y指定の移動の方法(Flash lite1.0)

    質問です。 MCが画面いっぱい、左右(x座標)に繰り返し移動するものを作りたいのですが うまく動作を指定できず悩んでいます・・・。 例えば、左に移動のみ、右に移動のみの繰り返しの動作はつけられます。 ですがそれを左に行ったら右に戻るという動作がつけられません。 もしかしたらとても簡単な事でしょうか? それでしたらすみません・・・。 そして、右端から左端に移動したら一段(15px)下がって再び同じ動作を繰り返す・・・何て事は可能でしょうか? ステージの大きさは、240×240です。 MCは、15×15のものと15×14のものの二種類で、基準点は中心です。 ちなみにグリッドは5pxに設定しています。 左端のxは-110、右端は110くらいで。 お分かりになる方がいらっしゃいましたら、ご返答いただきたいです。 宜しくお願いいたします。

    • ベストアンサー
    • Flash
  • ボタンで移動する前に、特定のMC再生

    ボタンで指定したフラグに移動する前に、 特定のムービークリップを再生後、 そのフラグに移動するといったことは出来ないのでしょうか? 例えば ボタンAはフラグAに対応 ボタンBはフラグBに対応 特定のMCのインスタンス名 aidaMC フラグAのstop();部分にボタンBがあり クリックするとaidaMCを再生後フラグBに移動といった感じです。 お分かりになる方ぜひ教えて下さい。 よろしくお願いします。 制作環境 WindowsXP / Flash8 PRO

    • ベストアンサー
    • Flash
  • [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でドラッグしたMCをリセットして戻すには

     今回もまたFlashのことで教えてください。 先日教えていただいた「ドラッグしたMCを常に上に表示&色の変化」がきちんと動作できて とても助かりましたが、また、新たな課題が出たので教えて下さい。(これまでできていたリセットボタンがうまく動作しなくなっちゃったのです。) 具体的に言うと、つまずいている課題は以下の通りです。  ドラッグして移動したMCを元の位置(フレーム上の最初にあった位置)に戻すために「リセットボタン」を配置しましたが、このボタンでリセットしてもなぜかドラッグして移動したMCもそのまま残った状態で表示されるのです。つまり、完全リセットされないのです。  ドラッグしたMCが元の位置に戻り、ドラッグする以前のフレームが表示されるようにしたいのでどうか教えてください。 私が書いたスクリプトとタイムラインを示しますので、どうぞよろしくお願いいたします。 バージョン Flash CS5.5    アクションスクリプト2.0     Flash Player 6 です。   フレーム1とフレーム2があり、フレーム1はフレーム2に進むためのボタンを配置。 フレーム2には赤の□2つ。白の□2つを配置。 フレーム2に書いたスクリプト(1)は以下の通り (ドラッグしたMCが常に上に表示&色の変化をさせるスクリプト) (赤の□のインスタンス名「R_mc1」「R_mc2」   白の□のインスタンス名「W_mc1」「W_mc2」 ) //--------------------------- //深度カウント用変数を用意 var dep_cnt:Number = 1; //変数 i に 1~2 を入れながらループ for (var i:Number = 1; i<=2; i++) { //★「R_mc○」内の再生を停止 this["R_mc"+i].stop(); //★「R_mc○」内の変数 target_mc に「W_mc○」の参照を代入 this["R_mc"+i].target_mc = this["W_mc"+i]; //「R_mc○」押下時に関数 dragMC を実行 this["R_mc"+i].onPress = dragMC; //「R_mc○」を放した時に関数 dropMC を実行 this["R_mc"+i].onRelease = dropMC; //「R_mc○」をMC外で放した時にも関数 dropMC を実行 this["R_mc"+i].onReleaseOutside = dropMC; } //関数 dragMC の定義 function dragMC():Void { //深度カウント用変数をカウントアップ dep_cnt++; //押下されたMCをその深度に移動 this.swapDepths(dep_cnt); //押下されたMCのドラッグを開始 this.startDrag(); //★マウスが動く度に関数 watchHitW_mc を実行 this.onMouseMove = watchHitW_mc; } //関数 dropMC の定義 function dropMC():Void { //放されたMCのドラッグを終了 this.stopDrag(); //★マウスが動く度に関数 watchHitW_mc を実行するのを解除 delete this.onMouseMove; } //★関数 watchHitW_mc の定義 function watchHitW_mc():Void { //★ドラッグ中のMCがそのMC内の変数 target_mc に // 代入したMCとヒットしていれば if (this.hitTest(this.target_mc)) { //★ドラッグ中のMC内をフレーム2で停止 this.gotoAndStop(2); } else { //★それ以外はドラッグ中のMC内をフレーム1で停止 this.gotoAndStop(1); } } //--------------------------- ドラッグしたMCを元の位置に戻すための「リセットボタン」に書いたスクリプト(2)は以下の通り。 (以前に以下のようなスクリプトで元の配置にリセットされたので同じく書いてみましたが、今回はドラッグしたMCが消えず、そのまま表示されてしまいました。 //--------------------------- on (release) { gotoAndPlay(1); } on (release) { gotoAndStop(2); } //---------------------------  

    • ベストアンサー
    • Flash
  • ActionScript■指定回数でループを止めるには

    全てActionScriptだけで、動作させています。 ・Loadされたら、MCの移動量を定義 ・フレームに入ったら、ブラウザの縦横サイズを設定   {毎フレームごとに移動量を座標に足す     {もしMCが右端+100の位置に来たら、      (MCを左端-100に戻す) } 上記の{ }部を3回繰り返したら停止する、というものを作成したいのですが。 for文を入れて+Stop();を最後に記載したのですが、ダメでした。 回数を指定しないと、ちゃんと動作しますが当然ながら無限に動きます。 すみません、どなたかご教示頂けませんでしょうか。 どうぞよろしくお願いします。 ※当方Flash8にて制作しております。

    • ベストアンサー
    • Flash
  • マウスアウト処理とボタンの処理の重なりについて

    いつもお世話になっております。 FLASHで以下の仕様のボタンを作成しようとしております。 (※添付の図を参照願います) 四角い箱(box_mc)が配置されている場所にマウスカーソルを乗せると、 マウスーオーバー処理が動作し、box_mcがフェードインで表示されます。 box_mcはマウスアウトするとフェードアウトして消える(ボタンも一緒に消える) アニメーションになっています。 マウスオーバー処理(box_mc.addEventListener(MouseEvent.MOUSE_OVER)までは 良いのですが、box_mc上にある複数ボタンのどれかにマウスカーソルを 合わせると、box_mcのマウスアウト処理(box_mc.addEventListener (MouseEvent.MOUSE_OUT)が実行されてしまいます。 原因としては、box_mc上にある複数ボタンのどれかにマウスを乗せた時 (ハンドカーソルになっている時)は、マウスカーソルがbox_mc外にあると 判断され、box_mcのマウスアウト処理が実行されているのではないかと 考えました。 「box_mc上にあるボタンにカーソルを合わせても、box_mcのマウスアウト処理が 実行されず、box_mc上のボタンが処理できる」というのが理想の仕様ですが、 上記の仕組みでは難しそうなので、「マウスがbox_mcの座標外に出たらマウス アウト処理を実行する」という処理を考えていますが、 もっとシンプルな方法で処理できないか悩んでおります。 何方か知恵をお貸しいただけないでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • Flash

専門家に質問してみよう