AS3 — Как вы игнорируете класс (ошибка # 1009)?

#class #actionscript-3

#класс #actionscript-3

Вопрос:

Я создал класс для видеоролика, создающего монеты, которые игрок (символ) должен забрать. Предполагается, что все, что должен делать класс, это добавлять переменные score и coinscollected, а затем удалять одну монету со сцены. Но когда я меняю фрейм с помощью gotoAndStop(#); , консоль отправляет спам

Тип ошибки: ошибка # 1009: не удается получить доступ к свойству или методу нулевой ссылки на объект. «

Класс монет:

 public class coin extends MovieClip{
    var char:MovieClip;
    var MainTimeLine = MovieClip(root);
    public function coin() {
        // constructor code
            this.addEventListener(Event.ENTER_FRAME,update);

    }

    function update(event:Event):void{
        if(MainTimeLine.currentFrame!=5){
            char=MovieClip(root).char;
            if(this.hitTestObject(char)){
                this.removeEventListener(Event.ENTER_FRAME,update);
                parent.removeChild(this);
                MainTimeLine.score  ;
                MainTimeLine.coinscollected  ;
            }
        }
    }

}
 

Комментарии:

1. Просто совет по лучшей практике чтения кода. Используйте первую букву в верхнем регистре для КЛАССОВ и первую букву в нижнем регистре для имен экземпляров / переменных. Так что в вашем случае coin должно быть Coin и MainTimeLine должно быть mainTimeLine . Это также помогает с подсветкой кода в stackoverflow

2. Вы можете либо исправить эту ошибку, либо проигнорировать ее с помощью инструкции try / catch ( действительно плохая практика). Кроме того, проигрыватель может запутаться, если вы пишете имена переменных с заглавной буквы.

3. Монета анимирована? В этом случае вам также следует выполнить функцию stop() перед ее удалением. Кроме того, в какой строке эта ошибка? Кроме того, вы должны изменить var char:MovieClip значение просто var char так, чтобы оно не было нулевым. (Имейте в виду, что все функции и переменные должны быть в верблюжьем корпусе.)

Ответ №1:

Корень не заполняется до тех пор, пока ваш отображаемый объект не будет добавлен в список отображения. Вам нужно прослушать это событие, прежде чем устанавливать переменную.

 var char:MovieClip;
var MainTimeLine; //do not initialize here, root is null at this point

public function coin() {
    // constructor code

    //root is still null here sometimes too, so see if it's populated yet
    if(root){
        init(); //root is populated, skip to initialization
    }else{
        this.addEventListener(Event.ADDED_TO_STAGE,addedToStage);  //root isn't populated yet, listen for added to stage and then initialize
    }
}

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

private function init():void {
    MainTimeLine = MovieClip(root)
    this.addEventListener(Event.ENTER_FRAME,update);
}
 

Комментарии:

1. Большое вам спасибо за ваш ответ, но я только что понял, что мне следовало подробнее остановиться на ошибке. Ошибка 1009 указывает на «монету / обновление ()».

2. Ответ остается в силе. Вот где это приведет к ошибке, потому что именно там вы пытаетесь использовать свой MainTimeLine var, который был установлен null .