ActionScript 3 - 第一个操作的Stage对象为null

时间:2014-02-21 21:47:11

标签: actionscript-3 object null stage

我基本上一直试图创造一个国际象棋游戏,它有一些基本的功能。我遇到了一些我似乎无法解决的运行时错误。我一直试图寻找解决方案,我找到了几个,但它们似乎都不适合我。

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

舞台上有一个五边形对象(一个MovieClip),其实例名称为PentaGray,一类为Gray。有一个名为PentaClass的中间类。

Main(文档)类:

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()

如果我将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

另外,如果我通过在构造函数中取消注释语句来运行Gray中的函数,它可以正常工作,但对于我的游戏,我需要从文档类中运行子类函数。

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

我尝试过使用事件监听器(ENTER_FRAME和一个Timer)但他们仍然没有解决问题。

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

2 个答案:

答案 0 :(得分: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类对我来说没有意义。你为什么不再为它做另一个课程呢?

答案 1 :(得分: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();
    }

干杯