2013-03-12 79 views
1

我想在完成动画时删除并重新添加/“重新启动”Main类。我所有的动画都发生在Main中,并被添加到Main中的显示树中。 Program.as通过添加/删除Main来处理所有这些。我如何在Main.as中运行finishNow()函数?它一切正常,除了引发错误program.finishNow();

TypeError:错误#1009:无法访问空对象引用的属性或方法。

如何重新启动AS类动画

的FLA文件:

挂Program.as。

的Program.as文件:

package { 

    import flash.display.MovieClip; 

    public class Program extends MovieClip { 


     public function Program() { 

      startNow(); 
     } 

     function startNow() { 
      var run:Main = new Main(this); 
      addChild(run); 
     } 

     function finishNow() { 
      removeChild(run); 
      var run:Main = new Main(this); 
      addChild(run); 
     } 

    } 

} 

的Main.as文件:

package { 

    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 

     var stageHolder:Object; 
     public var program:Program; 

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

      someFunctionsThatDrawGraphics(); 
     } 

     function callFinishFunction():void { 
      // how to call finishNow() function from Program.as file here? 
      program.finishNow(); 
     } 

    } 
} 

回答

0

修复TypeError: Error #1009: Cannot access a property or method of a null object reference.可以在下面找到。此前该类指向一个空对象。

package { 

    import flash.display.Sprite; 

    public class Main extends Sprite 
    { 

     // var stageHolder:Object; <- REMOVE this line 
     public var program:Program; 

     public function Main(stageHolderTemp) { 
      program = stageHolderTemp; // changed stageHolder to program 
      trace(program); // changed stageHolder to program 

      someFunctionsThatDrawGraphics(); 
     } 

     function callFinishFunction():void { 
      program.finishNow(); 
     } 

    } 
} 
2

你应该把你run可变类范围的,不能正常范围内。

package { 
    import flash.display.MovieClip; 
    public class Program extends MovieClip { 
    var run:Main; // <- THIS line 
     public function Program() { 
      startNow(); 
     } 
     function startNow() { 
      run = new Main(this); // and no 'var' here 
      addChild(run); 
     } 
     function finishNow() { 
      removeChild(run); 
      run = new Main(this); // also no 'var' here 
      addChild(run); 
     } 
    } 
} 
+0

即使它是全球性的(我复制并粘贴了你的代码),它仍然显示出同样的错误? – ArrayOutOfBounds 2013-03-12 16:16:13

+0

@ArrayOutOfBounds,Vesper的答案正在纠正至少一个问题。在原始代码中,'finishNow()'方法中的'run'变量应该为空。该方法如此之短,很难看出为什么“空对象引用”错误仍然会发生,但对于该方法的其他两行没有意义:)我建议您安装调试Flash Player,错误消息会为您提供问题发生位置的行/帧编号,然后您可以确切确认问题所在。 – 2013-03-12 16:31:26

+0

@ArrayOutOfBounds哦,我认为Vesper和我可能误解了你对错误发生地点的评论。就像我说的,他指出了另一个问题。但是在它到达那里之前,这个错误会在'Main.as'里面的'callFinishFunction()'方法中抛出。那里也出现了同样的问题。 'Main.as'有一个'program'变量,但它永远不会被设置并且为空。程序变量和'stageHolder'变量是多余的。为了修复,保留Vesper的修复,然后删除'stageHolder'并在'Main.as'的构造函数中执行'program = stageHolderTemp'。 – 2013-03-12 16:37:41