【问题标题】:ActionScript 3 - Stage object is null for first operationActionScript 3 - 第一次操作的舞台对象为空
【发布时间】:2014-02-21 21:47:10
【问题描述】:

我基本上一直在尝试创建一个国际象棋游戏,它具有一些基本功能。我遇到了一些似乎无法修复的运行时错误。我尝试四处寻找解决方案,找到了几个,但似乎没有一个适合我。

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

舞台上有一个五边形对象(MovieClip),它的实例名称为 PentaGray,类为 Gray。有一个叫做 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()

如果我将 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 和计时器),但它们仍然没有解决问题。

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

【问题讨论】:

    标签: actionscript-3 object null stage


    【解决方案1】:

    通过在Main 函数的Main 类中调用FairyTail(),您已将其放入主对象的“构造函数”中。 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 类对我来说没有意义。为什么不创建另一个类来扩展它?

    【讨论】:

    • 为了解释我想做什么,我将把它放回我的国际象棋游戏的背景中。主要功能具有检查何时单击图块的方法,如果在其上,我想检查其有效移动(允许移动到的位置)。为此,我尝试调用 Piece 类'(每种类型的棋子,例如棋子是棋子的子类)getMoves() 函数,但由于某种原因,当我将棋子/棋子导入主类时,一个名为boardCoordinates 存储瓦片对象,第一次使用时为空(如在 FairyTail 程序中)。我希望我已经正确解释了这一点。
    • 我应该注意,当我在文档类中注释掉 Piece/Pawn 的所有代码时,boardCoordinates 可以正常工作。 boardCoordinates 是在文档类的构造函数中初始化的二维数组。
    【解决方案2】:

    当然,您的舞台还没有准备好。使用下面在您的主类中完成的引导程序。

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

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多