• 締切済み

setTimeoutでの制御に関しまして

初めて質問をさせて頂きます。よろしくお願い致します。 「mc_Image1」、「mc_Image2」、「mc_Image3」という 各ムービークリップをストップボタンを押した際に時間差で停止させたいのですが 「mc_Image2」、「mc_Image3」がstopがかからない状態が稀に生じたりします。 (ムービークリップは全て、1フレーム目にstop();、10フレーム目にgotoAndPlay(2);と設定) 少し端折っておりますが、スクリプトを記載いたします。 ---------------------------- //何回ルーレットしたかカウントする var count:Number = 0; //スタート/ストップボタンが押された押されていないかのフラグ var flg_StartStop:Boolean = false; // mc_Image停止待機速度変数(ミリ秒) var hensu1 = 2000; var hensu2 = 3000; //スタート/ストップボタンを押した時に呼び出される関数 btn_StartStop.onPress = function() { if(flg_StartStop) { //選ばれたフレームに飛ぶ mc_Image1.gotoAndStop(parseInt(one)+1); // setInterval で hensu(ミリ秒)後に_root.gotoAndStop(); を実行 stopID = setInterval(function () { _root.mc_Image2.gotoAndStop(parseInt(two)+1); clearInterval(stopID); }, hensu); stop2ID = setInterval(function () { _root.mc_Image3.gotoAndStop(parseInt(three)+1); clearInterval(stop2ID); }, hensu2); //押されたかどうかの変数を「偽」に flg_StartStop = false; //カウンタを増やす count++; } else { //ムービークリップを走らせる mc_Image1.play(); mc_Image2.play(); mc_Image3.play(); //押されたかどうかの変数を「真」に flg_StartStop = true; } } ---------------------------- 。 きちんと「gotoAndStop();」させるにはどのように対処すれば よろしいでしょうか。 不足がございましたら申し訳ありません。 何卒よろしくお願い致します。

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

みんなの回答

  • cspl
  • ベストアンサー率83% (55/66)
回答No.2

このような場合、「stopがかからない状態が稀に」起こる時と起こらない場合での条件を検証することが必要です。 現状与えられている情報で検証すべき項目を挙げてみますが、スクリプトだけの問題とも言い切れません。traceを使って根気強く検証するしかないと思います。また、setIntervalでなく、代わりにonEnterFrameで試してみてもよいかもしれません。 1. このボタンを2秒以内に3度以上連打した場合(連打できる仕様なのかは判断できませんが)、setIntervalで定義したタイマーが動作しているまま、再度定義することになので、正常に動作しない可能性があります。 →連打させないようにするか、else文にclearIntervalを記述する。 2. one,two,threeの値は正常に定義されているか? →onPress関数内にtraceを使用して確認する。 3. gotoAndStop()で指定した数値のフレームが存在しているか? →1~10の値の範囲を超えていないかtraceを使用して確認する。 4. 仮に10フレーム目に飛ばした場合、gotoAndPlay(2)と記述されていれば、stop()はかからず再生され続けてしまいます。

momoimo
質問者

お礼

cspl様ご返答ありがとうございます。 考えられる原因としましては、cspl様が上げられていらっしゃる「1」に当てはまるように思いました。 (「2」ですが、こちらは正常でした) >else文にclearIntervalを記述する こちらを先に試してみようと思います! ご提案をありがとうございます。 後程結果をご報告いたしますね。

  • cspl
  • ベストアンサー率83% (55/66)
回答No.1

____________________ // setInterval で hensu(ミリ秒)後に_root.gotoAndStop(); を実行 stopID = setInterval(function () { _root.mc_Image2.gotoAndStop(parseInt(two)+1); clearInterval(stopID); }, hensu); ____________________ hensu1は定義されていますが、上記の最後の行のhensuは定義されているのでしょうか? one, two , threeもどのタイミングでどのように定義さているのか気になります。

momoimo
質問者

お礼

早速のご返答をありがとうございます。 記述ミスがありまして(タイトルも異なっており申し訳ありません)… 「mc_Image2」にhensu1 「me_Image3」にhensu2 を適応するようにしております。 one, two , threeですが、こちらは外部textからの数値の読込み&分割の際に使用しております。 (各ムービークリップには1フレーム毎に0~9の数字を並べています) //数値取得 var str_Target = GetNumber(); //3桁の数値(文字列)を3つに分割 var one:String = str_Target.substr(0,1); //百の位 var two:String = str_Target.substr(1,1); //十の位 var three:String = str_Target.substr(2,1); //一の位 まだ不足がございましたら申し訳ありません。

関連するQ&A

  • 数秒後に別フレームにとばす方法

    1フレーム目で画像を読み込み10秒表示させた後に2フレーム目でまた10秒表示させるといった事を試しています。 表示させる画像はムービークリップで最後の1秒でフェードアウトさせるようにしているのですが 完全にフェードアウトする前に2フレーム目に飛んでしまいます。 何か解決方法はないのでしょうか?? 1フレーム目 ---------------------------------------------------------- this.stop(); timerID = setInterval(startMovie, 10000); function startMovie() { clearInterval(timerID); gotoAndStop(2); } 2フレーム目 ---------------------------------------------------------- this.stop(); timerID = setInterval(startMovie, 10000); function startMovie() { clearInterval(timerID); gotoAndStop(1); } ちなみにgotoAndStop();を消すとそのフレームでループしますが完全にフェードアウトしてくれます…。

    • ベストアンサー
    • Flash
  • 階層をまたぐ命令について

    Flash CS4 as2.0です。 メインタイムラインの下にムービークリップmc1、flash1、flash2をつくり、mc1の下にさらに ムービークリップmc2を作りまして、メインタイムラインには、var hensu=0;という変数を設定しています。この場合のmc2に書いたスクリプトの動作についてですが、 on(release){ _root.flash1.gotoAndStop("aa"); ・・・(1) _root.flash2.gotoAndStop("bb"); ・・・(2) _root.hensu=1; ・・・(3)        } 上記の(1)と(2)は実行されますが、(3)については実行されません。 記述を(3)、(1)、(2)と変えても同じです。 孫階層から2代上の親階層(メインタイムライン)へのアクセスはできないのでしょうか。

  • 子ムービークリップの制御について

    flash初心者です。子ムービークリップの制御について教えてください Tシャツのシュミレーションがあるとします。 シャツ_mcに、1フレーム目「丸くび」、2フレーム目「Vネック」、のカタチで シャツ_mc.色_mcにマスクをかけています。 色_mcには1フレーム目「白」、2フレーム目に「赤」とします。 シャツ_mc.色_mcのそれぞれ1フレームにstop(); ボタン「丸くび_btn」「Vネック_btn」「白_btn」「赤_btn」の4つのボタンで それぞれ組み合わせを作りたいのですが 「丸くび_btn」に on (release) { _root.シャツ_mc.gotoAndStop(1); } 「Vネック_btn」に on (release) { _root.シャツ_mc.gotoAndStop(2); } 「白_btn」に on (release) { _root.シャツ_mc.色_mc.gotoAndStop(1); } 「赤_btn」に on (release) { _root.シャツ_mc.色_mc.gotoAndStop(2); } この場合「丸くび_btn」をクリックして「赤_btn」クリックで「丸くび赤シャツ」ができます ここまではいいのですが 赤の色を保持したまま「Vネック_btn」を押してVネック赤シャツのイメージも見たいのですが 色が白に戻戻ってしまいます。(色_mcの1フレーム目に戻る。) これをなんとかしたいのですが。 (色_mcが選ばれた状態で固定され勝手に移動しないようにしたい) アドバイスお願いいたします。

  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • AS3:ルートの変数とムービークリップ内の変数について

    AS3:ルートの変数とムービークリップ内の変数について ルートのタイムラインで設定した変数var RootVarがあるとして、これをあるムービークリップMCからMovieClip(root).RootVarで読み取って、MC内で何か処理をしたときMovieClip(root).RootVar++;とやってもルートのRootVarの値は変わりません。 例えば、 ■ルートのタイムライン1フレームに記述 var RootVar:uint; if(RootVar>=3){ trace("できた!!"); } ■ステージにあるムービークリップMCのタイムライン1フレームに記述 MovieClip(root).RootVar=0; var AddTimer:Timer = new Timer(1000,3); AddTimer.addEventListener(TimerEvent.TIMER,AddNum); AddTimer.start(); function AddNum(eventObject:TimerEvent):void { MovieClip(root).RootVar++; } ルートからムービークリップ、ムービークリップからルートへ変数に値を渡したり受け取ったりはできなのでしょうか? 変数の扱い方が問題なのでしょうか?よろしくお願いします。 環境:AS3、Flash CS4

    • ベストアンサー
    • Flash
  • マウスホイールで地球儀を回転させたい

    質問です。 下記のスクリプトは地球儀をマウスで回転させるという物なのですが、 これをマウスホイールで回転させるためにframeにxmouseの値ではなくonWheelMouseの値を与えたいのですが、記述の仕方がわかりません。 知恵を貸してください。 on (press) { function run(mc) { cur = Math.floor((_xmouse - w1) / 10); pre = !pre ? (cur) : (pre); frame = cur - pre; frame = frame > 4 ? (4) : (frame); frame = frame < -4 ? (-4) : (frame); if (mc._currentframe + frame >= mc._totalframes) { mc.gotoAndStop(1); } // end if if (mc._currentframe + frame <= 1) { mc.gotoAndStop(mc._totalframes); } // end if mc._parent.b.gotoAndStop(mc._currentframe + frame); mc.gotoAndStop(mc._currentframe + frame); pre = cur; } // End of the function mm["t" + mm.OnName].WCD_Move({_alpha: 0}, {speed: 0.500000}); var w1 = this._width / 2; _parent._parent.rotate = false; intervalID = setInterval(run, 10, this); } on (release, releaseOutside){ pre = cur = false; clearInterval(intervalID); }

  • すべてのMCを1フレーム目へ

    ステージ上にMCのインスタンスが100個あるとします。 ボタンのクリックで全部のMCを1フレーム目へ移動させたいと思っています。 _root.EVENT_btn.onRelease = function() { _root.A_mc.gotoAndStop(1); _root.B_mc.gotoAndStop(1); _root.C_mc.gotoAndStop(1); _root.D_mc.gotoAndStop(1); : : } とひとつずつ書くしかないのでしょうか? ほかに効率のよい書き方はありますか? (注)すべてのインスタンスの親は同一オブジェクトではありません。

    • ベストアンサー
    • Flash
  • Flash 変数宣言

    これまた超基本的な事ですが、 Flash(AS3)で変数宣言をする際の記述方法について質問させてください。 現在自分がやっている方法では、変数宣言する際 --------------------------------------------------------- var hensu:String = "あいうえお"; --------------------------------------------------------- としていて、これを例えばrootから ムービークリップ「mc」内に変数「hensu」を作る場合 --------------------------------------------------------- mc.hensu = "あいうえお"; --------------------------------------------------------- としています。これで特に問題ないのですが、 値を何も入れず、とりあえず変数だけ用意しておく場合、 rootに変数を作る時は --------------------------------------------------------- var hensu:String = new String(); --------------------------------------------------------- としています。また、 --------------------------------------------------------- var hensu:String; --------------------------------------------------------- だけでも、変数が作成されているよう?なのですが・・・ trace()で調べると new String()の場合は値が"空白"(何も表示されない) hensu:String;の場合は"null"になります。 という事はどちらの場合でも単純に変数だけ作るのであれば これで機能していると考えてもよいのでしょうか? この"空白"と"null"の違いを理解したいです。 また、rootからムービークリップ「mc」内に変数「hensu」を作る場合として、 --------------------------------------------------------- mc.hensu = new String(); --------------------------------------------------------- とすれば、大丈夫ですが --------------------------------------------------------- mc.hensu:String = new String(); --------------------------------------------------------- や --------------------------------------------------------- mc.hensu:String; --------------------------------------------------------- ではエラーが出ます。 root上に変数を作る時の --------------------------------------------------------- var hensu:String = new String(); --------------------------------------------------------- や、別の場所に変数を作る場合でも --------------------------------------------------------- mc.hensu = new String(); --------------------------------------------------------- では問題ないのに、 ●●●.変数:型 = new 型(); の形にするとエラーが出るのはなぜなのでしょうか? (記述方法が間違っているといわれればそれまでですが・・・)

  • マウス位置によって画像を切り替える

    ステージ上のマウス位置を読み取り、その座標によって画像を切り替えるFlashを作成中なのですが、上手くいきません。 流れとしては 画像のファイルを読み込む ↓ 画像のファイル分だけムービークリップを作成 ↓ マウスの座標に応じて画像(ムービークリップを切り替える) というものです。 下記のようにかいています。 ●1フレーム目 //各画像の変数読み込み jpg1 = "test1.jpg"; jpg2 = "test2.jpg"; jpg3 = "test3.jpg"; jpg4 = "test4.jpg"; //初期配置 //空のMCを作成し、その中に画像変数を読み込ませる。 _root.createEmptyMovieClip("image_mc0",4); _root.createEmptyMovieClip("image_mc1",3); _root.createEmptyMovieClip("image_mc2",2); _root.createEmptyMovieClip("image_mc3",1); _root.image_mc0.loadMovie(_root.jpg1); _root.image_mc1.loadMovie(_root.jpg2); _root.image_mc2.loadMovie(_root.jpg3); _root.image_mc3.loadMovie(_root.jpg4); //マウスが押されたときに変数MCclickをオンにする _root.mouse_mc.onPress = function() { MCclick = true; trace( "押された時の変数 " +_root.MCclick); } //マウスが離れた時に変数MCclickをオフにする _root.mouse_mc.onRelease = function() { MCclick = false; trace( "離れた時の変数 " +_root.MCclick); nowpoint = (_root._xmouse); trace( "今の位置" + nowpoint); } //マウスがボタン領域外にいった時に変数MCclickをオフにする _root.mouse_mc.dragOut = function() { MCclick = false; trace( "どっかいった時の変数 " +_root.MCclick); } stop(); ●ステージ上にかぶせている透明なMC(mouse_mc) //MCclickがオンの時変数mc_xの値をとり続ける onClipEvent (mouseMove) { if (_root.MCclick) { _root.mc_x = (_root._xmouse); trace( "押された時の変数mc_xの位置 " + _root.mc_x); trace( "マウスを押したままの変数 " + _root.MCclick); //100以下の時に画像1を表示 if((_root.mc_x >= 0) || (_root.mc_x <= 100)){ _root.image_mc0._visible = true; _root.image_mc1._visible = false; _root.image_mc2._visible = false; } else if((_root.mc_x >= 100) || (_root.mc_x <= 200)){ _root.image_mc0._visible = false; _root.image_mc1._visible = true; _root.image_mc2._visible = false; } else if((_root.mc_x >= 200) || (_root.mc_x <= 300)){ _root.image_mc0._visible = false; _root.image_mc1._visible = false; _root.image_mc2._visible = true; } } } この書き方で一応動作はするのですが、1枚目と2枚目の画像の切り返しか動作が行われなくて困っています。 画像のサイズ、ステージのサイズは両方とも 400*400です。

    • ベストアンサー
    • Flash
  • ボタンを押してもすぐ戻ってしまう・・・。

    1フレーム目に、 onEnterFrame = function():Void { if (_totalframes == _framesloaded) { gotoAndStop("snap"); } total = _root.getBytesTotal(); loaded = _root.getBytesLoaded(); percent = Math.floor(loaded/total*100); _root.bar_mc._xscale = percent; }; stop(); と記入し2フレーム目のフレームラベルをsnapに。 2フレーム目には、画像と次のフレームにいくボタンが置いてあります。 ボタンには、 on(press){ gotoAndStop(3); } と書いてあるのですが。 このボタンを押すと、確かに3フレーム目にいくのですが、すぐ2フレーム目に戻ってしまうんです。 初めてローディングバーをつけてみたので、間違いだらけかもしれないですがどうすればいいか教えてください><

    • ベストアンサー
    • Flash

専門家に質問してみよう