0

再生、一時停止、次への 3 つのボタンがあります。再生ボタンをクリックすると、関数が呼び出されます(長時間実行)。コードが停止するように「一時停止」ボタンをクリックしたい。次に「再生」をクリックしたいときは、止まったところから続けてほしい。
また、「次へ」ボタンで次のコード行を実行してから一時停止したい。

最初はボタンで機能を停止しようとしましたが、行き詰まりました

var nrs,nrst:int;
nrs=1;
nrst=0;
import flash.events.MouseEvent;
butt.addEventListener(MouseEvent.CLICK, cont);
qwe.addEventListener(MouseEvent.CLICK, conts);

function chs():Boolean
{
    if (nrs==1) return true; else return false;
}

function cont(event:MouseEvent):void
{

    while (chs()==true)
    {
        nrst++;
        nrst=nrst%1234;
        str.text=nrst.toString();
    }
}
function conts (event:MouseEvent):void
{
    nrs=0;
}
4

1 に答える 1

1

秘訣は、プロセスの実行を停止するために、関数自体が開始/停止モードで動作する必要があるということです。これは、別のイベントを起動する前に、Flash イベント エンジンがイベント リスナーを実際に終了する必要があるためです。私は次のアプローチでこれを解決しました: enterframe リスナーを作成し、その中で実行する関数の 1 つのサイクルを作成します (サイクル間で使用できるはずのローカル変数が使用されていないことを確認してください!)、リスナーを終了します。このサイクルが実行されるたびに更新される一連の変数を作成します (1 つを使用するのが最適ですが、パフォーマンスには適していません)。試したようにグローバル変数/関数を介してサイクルの実行を制御するか、リスナー自体を追加/削除します。誤って 2 つのリスナーを追加してプロセスを台無しにする可能性があるため、グローバル フラグの方が適しています。単純なケースでは、構造は次のようになります。

butt.addEventListener(MouseEvent.CLICK, conts2);
qwe.addEventListener(MouseEvent.CLICK, conts);
this.addEventListener(Event.ENTER_FRAME,cont);

function chs():Boolean
{
    if (nrs==1) return true; else return false;
}

function cont(event:Event):void
{
    if (chs()) // IF, not WHILE, so that events could still be parsed
    {
        nrst++;
        nrst=nrst%1234;
        str.text=nrst.toString();
    }
}
function conts (event:MouseEvent):void
{
    nrs=0;
}
function conts2(e:MouseEvent):void {
    nrs=1;
}
于 2013-08-01T11:10:58.923 に答える