0

(我在 AS3 和 Adob​​e AIR for iOS SDK 中工作)。

该程序有两个类:第一个是Program.asFLA 文件链接到的类。其中Program.as有一个启动程序的功能和另一个重新启动程序的功能。第二个类是我的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();函数来解决这个问题。programRestartTimerError #2025不断显示的情况来看,我怀疑在第一次运行中未删除的显示子项(或类似的 - 例如其他计时器也未重置)会导致此问题。这表明程序没有创建一个全新的实例,或者 AS3 不可能?

程序.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);
        }
    }
}

主要作为:

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 实例添加了一个侦听器,但它从未被删除,这将导致您的程序在第二次调用后重置两次,这很可能是您的删除子错误的原因 - 您在一次删除它们两次排。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 回答