ActionScript 3 – Stage обектът е null за първата операция

По принцип се опитвах да създам игра на шах и тя има някои основни функции. Срещнах някои грешки по време на изпълнение, които изглежда не мога да коригирам. Опитах се да потърся решения и намерих няколко, но изглежда нито едно от тях не работи за мен.

След това създадох нов флаш проект, за да видя дали грешката все още се появява, само за да се уверя, че не е друга част от моята програма, която причинява проблема.

Сцената има петоъгълен обект (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()

Ако променя кода в основния клас на:

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 и таймер), но те все още не решиха проблема.

Как мога да променя програмата, така че обектът да не е null, когато определен код, напр. функцията 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 (всеки тип фигура, напр. пешка е подклас на фигура), но по някаква причина, когато импортирам Piece/Pawn в моя основен клас, масив, наречен boardCoordinates, който съхранява обекти на плочки, е null при първото използване (както в програмата FairyTail). Надявам се, че съм обяснил това правилно. - person Erza Scarlet; 22.02.2014
comment
Трябва да отбележа, че когато коментирам целия код за фигура/пешка в класа документ, 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