我基本上一直试图创造一个国际象棋游戏,它有一些基本的功能。我遇到了一些我似乎无法解决的运行时错误。我一直试图寻找解决方案,我找到了几个,但它们似乎都不适合我。
然后我创建了一个新的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本身的问题吗?
答案 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();
}
干杯