ActionScript 3 - объект Stage имеет значение NULL для первой операции

Я в основном пытался создать шахматную игру, и у нее есть некоторые базовые функции. Я столкнулся с некоторыми ошибками во время выполнения, которые не могу исправить. Я пробовал искать решения, и я нашел несколько, но ни одно из них, похоже, не работает для меня.

Затем я создал новый флеш-проект, чтобы проверить, возникает ли ошибка по-прежнему, просто чтобы убедиться, что проблема не в другой части моей программы.

На сцене есть объект пятиугольника (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 имеет значение null при запуске программы? Я думал, что объекты, которые размещаются на сцене с помощью IDE, инициализируются перед запуском любого написанного кода, но, похоже, это не так.

Я пробовал использовать прослушиватели событий (ENTER_FRAME и таймер), но они все еще не решили проблему.

Как я могу изменить программу, чтобы объект не был нулевым, когда определенный код, например функция FairyTail (), выполняется? Я написал свой код неправильно или это проблема самого Flash / ActionScript?


person Erza Scarlet    schedule 21.02.2014    source источник


Ответы (2)


Поместив вызов 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. Почему бы вам просто не создать еще один класс для его расширения?

person Damien Black    schedule 21.02.2014
comment
Чтобы объяснить, чем я хочу заниматься, я верну это в контекст моей шахматной партии. В основной функции есть методы для проверки нажатия на плитку, и если на ней есть фигура, я хочу проверить ее допустимые ходы (места, куда ей разрешено перемещаться). Для этого я попытался вызвать функцию getMoves () класса Piece (каждый тип фигуры, например пешка, является подклассом части), но по какой-то причине, когда я импортирую кусок / пешку в свой основной класс, массив с именем boardCoordinates, в котором хранятся объекты тайлов, имеет значение null при первом использовании (как в программе FairyTail). Надеюсь, я правильно это объяснил. - person Erza Scarlet; 22.02.2014
comment
Я должен отметить, что когда я комментирую весь код для Piece / Pawn в классе документа, boardCoordinates работает правильно. boardCoordinates - это 2D-массив, который инициализируется в конструкторе класса документа. - person Erza Scarlet; 22.02.2014

Конечно, ваша сцена не готова. Используйте начальную загрузку, сделанную ниже, в вашем основном классе.

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

Ваше здоровье

person Filipe Silvestrim    schedule 22.02.2014