0

(私は AS3 と Adob​​e AIR for iOS SDK で作業しています)。

このプログラムには 2 つのクラスがProgram.asあります。最初のクラスは、FLA ファイルがリンクされているクラスです。プログラムを開始する関数と、Program.asプログラムを再起動する関数があります。2 番目のクラスは、関数Main.asを呼び出してプログラムを再起動するクラスです。finishNow();Program.as

最初の実行では問題なく実行されます。問題は、再起動するとすぐに、自動的に再起動し続けるように見えることです。それもかなりの数のArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.エラーを与えます。また、プログラムの再起動時に TIMERS などの一部の機能が 0 から開始されないことにも気付きました?? ロジックは問題ないように見えるので、私は本当に困惑していますが、トレースは別のことを示しています.

内部にトレースを入れるProgram.asと、finishNow();関数が最初の実行後に繰り返し呼び出されていることがわかります。問題はprogramRestartTimer、新しいインスタンスでリセットされないことにあります。stop();関数を呼び出すことでprogramRestartTimer一時的にこれを修正します。表示され続けることからError #2025、最初の実行で削除されなかったチャイルドを表示する (または他のタイマーもリセットされないなど) ことがこの問題の原因であると思われます。これは、プログラムが完全に新しいインスタンスを作成していないか、AS3 では作成できないことを示唆しています??

Program.as:

package  {

    import flash.display.MovieClip;

    public class Program extends MovieClip {

        var runMain:Main;

        public function Program() {
            startNow();
        }

        function startNow() {
            runMain = new Main(this);
            addChild(runMain);
        }

        function finishNow() {
            removeChild(runMain);
            runMain = new Main(this);
            addChild(runMain);
        }
    }
}

Main.as:

package {

    import flash.display.Sprite;

    public class Main extends Sprite
    {
        public var program:Program;
        var programRestartTimer:Timer = new Timer(8 * 1000);

        public function Main(stageHolderTemp) {
            program = stageHolderTemp;
            trace(program);

            someFunctionsThatDrawGraphics();
            moreFunctions();
        }

        function callFinishFunction():void { // this is called at the end of the animation
            programRestartTimer.start();
            programRestartTimer.addEventListener(TimerEvent.TIMER, restartProgram);
        }

        function restartProgram(e:TimerEvent):void {
            programRestartTimer.stop(); // this line is a temporary "fix" to stop the program from constantly restarting
            // it doesn't actually fix the full problem
            program.finishNow();
        }

    }
}
4

1 に答える 1

0

AS3 では、自分自身を再初期化できるようにクラスを設計することは確かに可能です。ただし、これには再起動ルーチンを慎重に考案する必要があります。

まず、callProgramRestart()関数はリスナーを Program インスタンスに追加しますが、削除されることはありません。これにより、2 回目の呼び出しの後にプログラムが 2 回リセットされます。これが子の削除エラーの原因である可能性が最も高くなります。行。そのリスナーの必要性を完全に排除するには、flash.utils.setTimeout()マニュアル)を利用して関数を呼び出すようにしrestartProgramます。

function callFinishFunction():void { // this is called at the end of the animation
    flash.utils.setTimeout(restartProgram,8000);
}
function restartProgram():void {...}

次に、どこかで「完全な」再初期化を行う必要があります。クラスの別のインスタンスを作成する方法はMainおそらくうまくいくはずですが、Mainこれを呼び出す前に、以前のインスタンスからリスナーを適切にクリアする必要があります。

于 2013-03-18T04:14:17.450 に答える