web-dev-qa-db-ja.com

ActionScript 2または3で3秒待つ方法は?

たとえば、ActionScriptで3秒待機を実装する方法はありますが、同じ関数内にとどまるのですか? setInterval、setTimeOutなどの関数を調べましたが、実際に必要なのは次のとおりです。

public function foo(param1, param2, param3) {
  //do something here
  //wait for 3 seconds
  //3 seconds have passed, now do something more
}

なぜこれが必要なのか不思議に思うかもしれませんが、これは法的要件であり、変更することはできません。

Timer を使用して、3秒後に関数を呼び出します。

var timer:Timer = new Timer(3000);
timer.addEventListener(TimerEvent.TIMER, callback); // will call callback()
timer.start();

これを正しく行うには、タイマーをインスタンス変数として作成し、関数が呼び出されたときにリスナーとタイマーインスタンスを削除して、リークを回避する必要があります。

class Test {
    private var timer:Timer = new Timer(3000);

    public function foo(param1:int, param2:int, param3:int):void {
        // do something here
        timer.addEventListener(TimerEvent.TIMER, fooPartTwo);
        timer.start();
    }

    private function fooPartTwo(event:TimerEvent):void {
        timer.removeEventListener(TimerEvent.TIMER, fooPartTwo);
        timer = null;
        // 3 seconds have passed, now do something more
    }
}

foo関数内で別の関数を使用してスコープを保持することもできるため、変数を渡す必要はありません。

function foo(param1:int, param2:int, param3:int):void {
    var x:int = 2; // you can use variables as you would normally

    // do something here

    var timer:Timer = new Timer(3000);
    var afterWaiting:Function = function(event:TimerEvent):void {
       timer.removeEventListener(TimerEvent.TIMER, afterWaiting);
       timer = null;

       // 3 seconds have passed, now do something more

       // the scope is retained and you can still refer to the variables you
       // used earlier
       x += 2;
    }

    timer.addEventListener(TimerEvent.TIMER, afterWaiting);
    timer.start();
}
27
rid

AS3には Radu's answer を使用します。

AS2の場合、次のようにsetInterval関数を使用します。

var timer = setInterval(function, 3000, param1, param2);

function (param1, param2) {

// your function here
clearInterval(timer);

}
4
George Reith

TweenMax から delayedCall を使用することもできます。私見、TweenMaxファミリに精通している場合は、これが最も簡単な方法です。

TweenMax.delayedCall(1, myFunction, ["param1", 2]);

function myFunction(param1:String, param2:Number):void  
{ 
   trace("called myFunction and passed params: " + param1 + ", " + param2); 
}

あなたの場合、 anonymous 関数を使用します:

public function foo(param1, param2, param3) {
   //do something here
   trace("I gonna wait 3 seconds");

   TweenMax.delayedCall(3, function()
   {
       trace("3 seconds have passed");
   });
}
4
Marcelo Assis

ActionScriptにはSleepはありません。ただし、すべてのコードを単一の関数に入れずに同じことを実現し、その関数内で特定の時間待機する他の方法があります。

2つの関数でコードを簡単に作成し、1番目の関数で設定した特定のタイムアウト後に2番目の関数を呼び出すことができます。

2
DanielB

なぜあなたは正しい方法をする代わりにいくつかの混乱した方法をしているのですか?

「setTimeout()」という名前のメソッドがあります。

setTimeout(myFunction,3000);

myFunctionは、ピリオドの後に呼び出す関数です。3000は、待機するピリオド(ミリ秒単位)です。

間隔を設定してからクリアしたり、1回の繰り返しでタイマーを作成したり、他の操作を行ってトラブルを起こす必要はありません☺。

2
HITMAN

これはIS 1つの関数内ではありません-回答:「AS2&3でX秒待つ方法」

...なし setIntervalまたはclearIntervalを使用します。

上記の回答ははるかに速く、使いやすいです。念のためここに投稿しました...

場合によっては、set/clearIntervalまたは開発上の制限に基づく他の方法を使用できないことがあります。これらのメソッドを使用せずに遅延を発生させる方法を次に示します。

AS2-以下のコードをタイムラインにコピーして貼り付ける場合は、必ずbtnTestbtnGlowTestの2つのムービークリップをステージに追加してください(インスタンス名と同様に含める) )。 "btnGlowTest"を大きく、別の色に、そして "btnTest"の背後に(それぞれグローとボタンをシミュレートするために)作成します。

トレースステートメントの出力パネルをコンパイルして確認し、コードの動作を確認します。 btnTestをクリックします-btnGlowTestは、遅延の持続時間全体にわたって表示されます(視覚的な表現のみ)。

ここにもonEnterFrameカウントダウンタイマーがあります(デモの停止/切り替えタイマー)。

遅延/グローを長くしたい場合は、glowGameTime数を増やしてください。自分のニーズに合わせて名前を変更するか、ロジックを別の方法で適用します。

var startTime:Number = 0;
var currentTime:Number = 0;
var mainTime:Number = 5;//"game" time on enter frame

var glowStartTime:Number = 0;
var glowCurrentTime:Number = 0;
var glowGameTime:Number = 1.8;//"delayed" time on press

btnGlowTest._visible = false;

this.onEnterFrame = TimerFunction;
startTime = getTimer();

function TimerFunction()
{   
    currentTime = getTimer();   

    var timeLeft:Number = mainTime - ((currentTime - startTime)/1000);

    timeLeft = Math.floor(timeLeft);    
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up...3 bucks off");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

function glowTimerFunction()
{   
    glowCurrentTime = getTimer();   

    var glowTimeLeft:Number = glowGameTime - ((glowCurrentTime - glowStartTime)/1000);  

    glowTimeLeft = Math.floor(glowTimeLeft);    
    //trace("glowTimeleft = " + glowTimeLeft);

    if(glowTimeLeft <= 0)
    {
        trace("TIME DELAY COMPLETE!");
        //...do stuff here
        btnGlowTest._visible = false;//just for show
        btnTest._visible = false;//just for show
        StopTime();
    }
}

btnTest.onPress = function()
{
    trace("onPress");
    btnGlowTest._visible = true;
    StopTime(); 
    GlowTime();
}

function GlowTime()
{
    trace("GlowTime Function"); 
    this.onEnterFrame = glowTimerFunction;  
    glowStartTime = getTimer();
}

function StopTime()
{
    trace(">>--StopTime--<<");
    delete this.onEnterFrame;   
}

AS​​-以下は、AS3で実行するための上記のセットアップのコードです。同様の結果を達成するにはさまざまな方法がありますが、プロジェクトの範囲に基づいて、これらは物事を適切に機能させるために使用された方法です。

以下のコードをタイムラインにコピーして貼り付ける場合は、必ず2つのムービークリップbtnTestbtnGlowTest(インスタンス名などを含む)をステージに追加してください。 "btnGlowTest"を大きく、別の色に、そして "btnTest"の背後に(それぞれグローとボタンをシミュレートするために)作成します。

トレースステートメントの出力パネルをコンパイルして確認し、コードの動作を確認します。 btnTestをクリックします-btnGlowTestは、遅延の持続時間全体にわたって表示されます(視覚的な表現のみ)。

遅延/グローを長くしたい場合は、GlowTimer:Timer番号(現在は950に設定されています)。自分のニーズに合わせて名前を変更するか、ロジックを別の方法で適用します。

import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;

var startTime:Number = 0;
var currentTime:Number = 0;
var gameTime:Number = 4;//"game" time on enter frame

var GlowTimer:Timer = new Timer(950,0);//"delayed" time on press

btnGlowTest.visible = false;

GlowTimer.addEventListener(TimerEvent.TIMER, GlowTimeListener, false, 0, true);
btnTest.addEventListener(MouseEvent.MOUSE_DOWN, btnTestPressed, false, 0, true);
addEventListener(Event.ENTER_FRAME,TimerFunction, false, 0, true);

startTime = getTimer();

function TimerFunction(event:Event)
{   
    currentTime = getTimer();

    var timeLeft:Number = gameTime - ((currentTime - startTime)/1000);  

    timeLeft = Math.floor(timeLeft);
    trace("timeLeft = " + timeLeft);

    if(timeLeft <= 0)
    {
        trace("time's up, 3 bucks off");
        StopTime();
    }   
}

function GlowTimeListener (e:TimerEvent):void
{
    trace("TIME DELAY COMPLETE!");      
    StopTime();
}

function btnTestPressed(e:MouseEvent)
{   
    trace("PRESSED");       
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
    btnGlowTest.visible = true;
    GlowTimer.start();
}

function StopTime()
{
    trace(">>--Stop Time--<<");
    btnGlowTest.visible = false;//just for show
    btnTest.visible = false;//just for show
    GlowTimer.stop();
    removeEventListener(TimerEvent.TIMER, GlowTimeListener);
    removeEventListener(Event.ENTER_FRAME, TimerFunction);
}
0
CrabMan