新实例未重置其计时器和子项

时间:2013-03-18 00:22:52

标签: actionscript-3 flash oop instance main

(我在AS3和Adobe AIR for iOS SDK中工作)。

该程序有两个类:第一个是Program.as,这是FLA文件链接到的。在Program.as中,有一个启动程序的函数和另一个重启程序的函数。第二个类是我的Main.as类,它从finishNow();调用Program.as函数来重新启动程序。

它在第一次运行时运行良好。问题是,几乎一旦它重新启动,似乎KEEP自己重启。它也会产生很多ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.个错误。我还注意到程序重启时,某些函数如TIMERS不会再从0开始?我真的很难过,因为逻辑似乎没问题,但痕迹说不然。

Program.as中放置跟踪显示在第一次运行后重复调用finishNow();函数。问题在于programRestartTimer未在新实例上重置。通过调用stop();上的programRestartTimer函数暂时修复此问题。从持续显示的Error #2025开始,我怀疑在第一次运行中显示未删除的Childs(或类似的 - 例如其他Timers也没有重置)会导致此问题。这表明程序不是创建一个全新的实例,或者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();
        }

    }
}

1 个答案:

答案 0 :(得分:0)

在AS3中确定可以设计一个类,以便它能够重新初始化自己。但这需要仔细设计重启例程。

首先,您的callProgramRestart()函数会向Program实例添加一个侦听器,但它永远不会被删除,这会导致程序在第二次调用后重置两次,这很可能是导致删除子级错误的原因 - 你连续两次删除它们。您可以使用flash.utils.setTimeout()the manual)并将其定位为调用restartProgram函数来完全消除该听众的需要。

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

其次,你应该在某处进行“完全”重新初始化。您创建Main类的另一个实例的方法应该最有效,但是在调用之前,您应该正确地从前Main实例中清除您的侦听器。