2014-02-21 55 views
1

我基本上一直在尝试创建一个国际象棋游戏,它具有一些基本的功能。我遇到了一些我似乎无法修复的运行时错误。我尝试过寻找解决方案,并且找到了几个解决方案,但是他们都没有为我工作。ActionScript 3 - 第一次操作的舞台对象为空

然后,我创建了一个新的Flash项目,以查看错误是否仍然存在,只是为了确保它不是导致此问题的另一部分程序。

舞台上有一个五角形对象(一个MovieClip),它有一个PentaGray实例名和一个灰色类。有一个称为PentaClass的中间类。

主(文件)类:

import flash.display.MovieClip; 
import PentaClass; 
import Gray; 

public class Main extends MovieClip 
{ 
    // public var Natsu:String; 

    public function Main() 
    { 
     FairyTail(); 
    } 

    public function FairyTail() 
    { 
     trace("PentaGray = " + PentaGray); 
      trace("PentaGray's name is " + PentaGray.name); 
      PentaGray.TraceThis(); 
    } 
} 

PentaClass类:

public class PentaClass extends Main 
{ 

    public function PentaClass() 
    { 
    } 

    public function TraceThis():void 
    { 
     trace("Fairy Tail :D"); 
    } 
} 

灰色类:

public class Gray extends PentaClass 
{ 
    public function Gray() 
    { 
     // TraceThis(); 
    } 
} 

运行程序这样使这对被打印到输出窗口:

PentaGray = null 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at Main/FairyTail() 
at Main() 
at PentaClass() 
at Gray() 
at flash.display::Sprite/constructChildren() 
at flash.display::Sprite() 
at flash.display::MovieClip() 
at Main() 
PentaGray = null 
TypeError: Error #1009: Cannot access a property or method of a null object reference. 
at Main/FairyTail() 
at Main() 

如果我在主类中更改代码:

if (PentaGray) 
{ 
    trace("PentaGray's name is " + PentaGray.name); 
    PentaGray.TraceThis(); 
} 

然后,这是输出:

PentaGray = null 
PentaGray = [object Gray] 
PentaGray's name is PentaGray 
Fairy Tail :D 

另外,如果我在它的构造在取消对语句运行从灰色的功能,它工作正常,但对于我的游戏,我需要从文档类运行子类功能。

我想知道的是,为什么PentaGray在程序启动时为空?我认为使用IDE放置在舞台上的对象在任何编写代码运行之前都会初始化,但似乎并非如此。

我试过使用事件监听器(ENTER_FRAME和计时器),但他们仍然没有解决问题。

如何更改程序,以便某些代码(例如, FairyTail()函数被执行?我没有正确编写我的代码,或者这是Flash/ActionScript本身的问题吗?

回答

0

通过将电话FairyTail()放入Main函数的Main类中,您已将它放在主对象的“构造函数”中。 Main对象的构造函数是必须运行的第一件事,因为在创建main对象之前不会创建任何对象。当主对象被创建时,构造函数被首先调用。

如果你想创建PentaGray当事情向右跑,把它放在PentaClass的构造函数:

public class PentaClass extends Main 
{ 

    public function PentaClass() 
    { 
     Main.FairyTail(); 
    } 

} 

或者,如果你只是希望它在开始发生,你可以把它放在后主文件中的类声明。

#main document 

import flash.display.MovieClip; 
import PentaClass; 
import Gray; 

public class Main extends MovieClip { 
    //... 
} 

Main.FairyTail(); 

顺便说一句,它没有任何意义,我的PentaClass扩展Main类。你为什么不再创造另一个课程来延续?

+0

要解释什么是我想要做的,我就会把它放回我的棋局的内容。主函数有方法来检查一个瓷砖被点击的时间,如果一块瓷砖在上面,我想检查它的有效移动(它允许移动到的位置)。为了做到这一点,我试图调用Piece类(每种类型的片断,例如一个pawn是一个片段的子类)getMoves()函数,但由于某种原因,当我将Piece/Pawn导入到我的主类中时, boardCoordinates存储图块对象,在第一次使用时为null(就像在FairyTail程序中一样)。我希望我已经正确地解释了这一点。 –

+0

我应该注意到,当我将文档类中的所有Piece/Pawn代码注释掉时,boardCoordinates正常工作。 boardCoordinates是在文档类的构造函数中初始化的2D数组。 –

0

当然,你的舞台还没有准备好。在你的主课堂中使用下面的bootstrap。

public function Main():void 
    { 
     if (stage) init(); 
     else addEventListener(Event.ADDED_TO_STAGE, init); 
    } 

    private function init(e:Event = null):void 
    { 
     removeEventListener(Event.ADDED_TO_STAGE, init); 
     FairyTail(); 
    } 

干杯

相关问题