Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Выскакивает Error #1009 по непонятным причинам. (http://www.flasher.ru/forum/showthread.php?t=141025)

джонатан 13.06.2010 22:11

Выскакивает Error #1009 по непонятным причинам.
 
Вложений: 1
Добрый день дамы и господа. Помогите пожалуйста разрешить мне маленькую проблемку. Я в АС3 новичёк, поэтому возможна моя беда вам покажется смешной, однако я уже отсчялся совсем, и пришел к вам за помощью. Значит так:

Флешка, представляет собой следующее:

В рут из библиотеки добавляется клим Welcom, в котором создается CheckBox и Button. По нажатию на кнопку, положение CheckBox.selected записывается в SharedObject, клип удаляется и добавляется другой. При повторном запуске, если чек бокс был выставлен, то сразу вызывается метод, который происходил по нажатию кнопки, после записи в Shared object, и выполнение метода прерывается. Так вот если чек бокс небыл выставлен, то все работает отлично, но если был, то выскакивает ошибка:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".

В методе skipWelcome(), parent ровняется null, однако this как и нужно = welcome. В чем проблема расскажите пожалуйста.

Собственно код, главный её класс:

Код AS3:

package com.flashgangsta {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
 
        public class Main extends Sprite {
 
                private var welcome:MovieClip;
 
                public function Main() {
                        var welcome:MovieClip = new Welcome();
                        addChild(welcome);
                }
        }
}

Класс Welcome:

Код AS3:

package com.flashgangsta {
 
        import flash.display.MovieClip;
        import fl.controls.Button;
        import fl.controls.CheckBox;
        import flash.net.SharedObject;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Welcome extends MovieClip {
 
                private var skip:Button = new Button();
                private var dontShowAgain:CheckBox = new CheckBox();
                private var sharedObject:SharedObject = SharedObject.getLocal("skipWelcom");
 
                public function Welcome() {
                        if(sharedObject.data.dontShowAgain) {
                                skipWelcome(); // Вот тут возникает ошибка
                                return;
                        }
                        dontShowAgain.label = "Не показывать в следующий раз";
                        dontShowAgain.width = 202;
                        dontShowAgain.selected = false;
                        dontShowAgain.x = 300;
                        dontShowAgain.y = 505;
                        dontShowAgain.useHandCursor = true;
                        addChild(dontShowAgain);
 
                        skip.label = "Пропустить заставку"
                        skip.width = 190;
                        skip.x = 305;
                        skip.y = 533;
                        skip.useHandCursor = true;
                        addChild(skip);
 
                        skip.addEventListener(MouseEvent.CLICK, onSkipClicked);
 
                        this.addEventListener(Event.ENTER_FRAME, checkMoviePlayingProgress);
                }
 
                private function onSkipClicked(event:Object):void {
                        recordSharedObject();
                        skip.removeEventListener(MouseEvent.CLICK, onSkipClicked);
                        skipWelcome();
                }
 
                private function recordSharedObject():void {
                        sharedObject.data.dontShowAgain = dontShowAgain.selected;
                        sharedObject.flush();
                }
 
                private function skipWelcome():void {
                        parent.addChild(new EastingStartMenu()); //parent = null
                        parent.removeChild(this); //parent = null
                }
        }
}

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

udaaff 13.06.2010 22:17

Вы обращаетесь к parent, еще в конструкторе, т.е. до добавления Welcom в Main.

easy.proger 13.06.2010 22:20

Код AS3:

 package com.flashgangsta {
        import flash.display.MovieClip;
        import fl.controls.Button;
        import fl.controls.CheckBox;
        import flash.net.SharedObject;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Welcome extends MovieClip {
 
                private var skip:Button = new Button();
                private var dontShowAgain:CheckBox = new CheckBox();
                private var sharedObject:SharedObject = SharedObject.getLocal("skipWelcom");
 
 
public function Welcome()
{
    if (stage) init();
    else addEventlistener(Event.ADDED_TO_STAGE,init);
}
private function init(event:Event=null):void
{
    removeEventListener(Event.ADDED_TO_STAGE,init);
    if(sharedObject.data.dontShowAgain) {
                                skipWelcome();
                                return;
                        }
                        dontShowAgain.label = "Не показывать в следующий раз";
                        dontShowAgain.width = 202;
                        dontShowAgain.selected = false;
                        dontShowAgain.x = 300;
                        dontShowAgain.y = 505;
                        dontShowAgain.useHandCursor = true;
                        addChild(dontShowAgain);
 
                        skip.label = "Пропустить заставку"
                        skip.width = 190;
                        skip.x = 305;
                        skip.y = 533;
                        skip.useHandCursor = true;
                        addChild(skip);
 
                        skip.addEventListener(MouseEvent.CLICK, onSkipClicked);
 
                        this.addEventListener(Event.ENTER_FRAME,        checkMoviePlayingProgress);
}
 
private function onSkipClicked(event:Object):void {
                        recordSharedObject();
                        skip.removeEventListener(MouseEvent.CLICK, onSkipClicked);
                        skipWelcome();
                }
 
                private function recordSharedObject():void {
                        sharedObject.data.dontShowAgain = dontShowAgain.selected;
                        sharedObject.flush();
                }
 
                private function skipWelcome():void {
                        parent.addChild(new EastingStartMenu());
                        parent.removeChild(this);
                }
        }
}


джонатан 13.06.2010 22:22

Вы имеетее ввиду который находится на stage? Так ведь welcom на нем находится, он добавляется из главного класса:

Код AS3:

 
public function Main() {
        var welcome:MovieClip = new Welcome();
        addChild(welcome);
}

А проверка происходит уже в его конструкторе (Welcome).


Update:

easy.proger, спасибо большое, все заработало, теперь я понял в чем беда была, буду иметь ввиду.

З.Ы. если вдруг наглянет администрация, возьмите на заметку, что в новой опере, невозможно не редактировать сообщение, не пользоваться кнопками вставки тегов в панели при создании топика или мессаги.

Всем спасибо!

easy.proger 13.06.2010 22:33

Интересно, а какой по вашему должен быть парент у объекта которого нет на сцене ? или вы считаете, что добавление на сцену происходит телепатически ? Давайте проанализируем ваш код

Вы создаете объект var welcome:MovieClip = new Welcome(); при этом входите в конструктор, но ведь addChild(welcome) еще не был вызван и нас нету на сцене ! и тут же мы спрашиваем у себя кто парент, ну и кто может быть парентом у объекта которого еще нету на сцене ? конечно null, поэтому я привел код в котором мы ждем пока нас добавят на сцену после чего уже нам будет доступно и stage и parent …

джонатан 13.06.2010 22:57

easy.proger, то что я писал до апдейта я не вам, после вашего примера я все понял, почему то мне не пришло в голову что конструктор выполняется после создания экземпляра класса, а казалось, что именно после того как он будет добавлен на стейдж. Извеняю, действительно глупо, и очень благодарю за помощь.


Часовой пояс GMT +4, время: 21:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.