(我在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();
}
}
}
答案 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
实例中清除您的侦听器。