addChild выдает исключение - PullRequest
       1

addChild выдает исключение

0 голосов
/ 30 ноября 2011

Я работаю над игрой. Я разработал панель процессов во Flash и связал ее с AS 3. В основном классе (main_c.as) я назначаю переменную для этапа:

package  {

import flash.display.MovieClip;
import flash.display.Stage;


public class main_c extends MovieClip {

    static public var stageRef:Stage;
    public var s:start_b;
    public var bar:timer_bar;
    public function main_c() 
    {
        // constructor code
        stageRef = stage;
        s = new start_b();
        addChild(s);
        s.x = 260;
        s.y = 225;

    }


}

}

затем есть класс start_b, который должен создать кнопку и щелкнуть, чтобы запустить конструктор третьего класса (game.as). Вот код start_b:

package  {

import flash.display.SimpleButton;
import flash.events.MouseEvent;

public class start_b extends SimpleButton {

    public var g:game;

    public function start_b() 
    {
        // constructor code
        this.addEventListener(MouseEvent.CLICK, start_g);
    }

    public function start_g(e:MouseEvent):void
    {
        g = new game();
        this.removeEventListener(MouseEvent.CLICK, start_g);
        this.visible = false;
    }
}

И в последнем классе я хочу добавить строку состояния Child со ссылкой на сцену, но когда я запускаю, я получаю ошибку -

TypeError: Error #1009: Cannot access a property or method of a null object reference. at game() at start_b/start_g()

вот код третьего класса (game.as):

package{

import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;
import main_c;

public class game extends MovieClip {
    public var points:Number;
    public var ptw:Number;
    public var time:Timer;
    public var bar:timer_bar = new timer_bar();
    public var cnt:main_c;

    public function game()
    {
        //restartirane na igrata (nulirane)
        main_c.stageRef.addChild(bar);
        points = 0;
        time = new Timer(50);
        time.addEventListener(TimerEvent.TIMER, flow);
        time.start();
        trace("d");


    }

    public function flow(t:TimerEvent):void 
    {
        //code
        //bar.y++;
    }

    public function addPoints():void
    {
        //function code here
    }

    public function removePoints():void
    {
        //function code here
    }

    public function checkTime():void
    {
        //function code here
    }

    public function end():void
    {
        //function code here
    }

}

}

Если бы вы могли мне помочь, я буду очень рад :-) Спасибо и хорошего дня!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2011

Подсказка № 1:

TypeError: Ошибка # 1009: Невозможно получить доступ к свойству или методу пустой ссылки на объект. в игре () в start_b / start_g ()

Это означает, что некоторый объект в конструкторе game имеет значение null, но вы пытаетесь получить доступ к функции-члену или свойству этого объекта.

Разбить его:

main_c.stageRef.addChild(bar);
points = 0;
time = new Timer(50);
time.addEventListener(TimerEvent.TIMER, flow);
time.start();
trace("d");

Единственная возможная причина ошибки здесь - первая строка

main_c.stageRef.addChild(bar);

Итак, решение этой проблемы состояло бы в том, чтобы увидеть, является ли main_c.stageRef нулем, и действовать соответственно

Мое решение для этого: переопределить конструктор класса игры:

public function game() {
    init();
}

public function init() {
    if(main_c.stageRef) {
        //restartirane na igrata (nulirane)
        main_c.stageRef.addChild(bar);
        points = 0;
        time = new Timer(50);
        time.addEventListener(TimerEvent.TIMER, flow);
        time.start();
        trace("d");
    } else {
        callLater(init);
    }
}

Документация для метода callLater

На несвязанной заметке имена классов ActionScript начинаются с буквы UPPERCASE по соглашению. Это помогает отличить их от имен экземпляров, которые начинаются со строчной буквы.

0 голосов
/ 01 декабря 2011

Вам нужно проверить, готова ли ваша сцена:

Main_c / constructor:

   public function main_c() 
   {
    if (stage)
    {
        init();
    }
    else
    {
        addEventListener(Event.ADDED_TO_STAGE, init);
    }
   }

Main_c / init:

private function init(e:Event = null):void 
{
    removeEventListener(Event.ADDED_TO_STAGE, init);

    stageRef = stage;
    s = new start_b();
    addChild(s);
    s.x = 260;
    s.y = 225;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...