Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   stage null reference (http://www.flasher.ru/forum/showthread.php?t=211547)

Freeman 19.09.2015 02:20

stage null reference
 
Часто сталкивался с подобной ошибкой, но каким-то образом не запариваясь решал, писал по другому немного. Вот скажите, пожалуйста, как мне действовать таким образом, вызывать настройку окна из майна, через класс. Было бы удобно, но говорит stage не существует. В самом Main, срабатывает любой вызов stage, что мне сделать для подобного подхода?

Код AS3:

    package
    {
        import flash.display.Sprite;
        import system.Window;
 
        public class Main extends Sprite
        {
            public function Main()
            {
                Window.init();
            }
        }
    }

Код AS3:

    package system
    {
        import flash.display.Sprite;
 
        public class Window extends Sprite
        {
            private static var window:Window;
 
            public function Window()
            {
 
            }
 
            public function init():void
            {
                stage.addChild(window);
            }
 
            public static function init():void
            {
                window = new Window();
                window.init();
 
                //window.stage.stageWidth = 2000;
            }
        }
    }

Код:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
        at system::Window/init()[D:\Projects\Programming\AS3 Рё Flash\Тренировки\FlashED\src\system\Window.as:17]
        at system::Window$/init()[D:\Projects\Programming\AS3 Рё Flash\Тренировки\FlashED\src\system\Window.as:23]
        at Main()[D:\Projects\Programming\AS3 Рё Flash\Тренировки\FlashED\src\Main.as:13]
        at runtime::ContentPlayer/loadInitialContent()
        at runtime::ContentPlayer/playRawContent()
        at runtime::ContentPlayer/playContent()
        at runtime::AppRunner/run()
        at ADLAppEntry/run()
        at global/runtime::ADLEntry()


neonoviiwolf 19.09.2015 03:13

Код AS3:

  package
    {
        import flash.display.Sprite;
        import system.Window;
 
        public class Main extends Sprite
        {
            private var _Window:Window = new Window();
            public function Main()
            {
                addChild(_Window);
            }
        }
    }

Код AS3:

    package system
    {
        import flash.display.Sprite;
 
        public class Window extends Sprite
        {
            private static var window:Window_mc; //тут мувик
 
            public function Window()
            {
                  addEventListener(Event.ADDED_TO_STAGE, init);
            }
            public function init():void
            {
                removeEventListener(Event.ADDED_TO_STAGE, init);
                window = new Window_mc();
                stage.addChild(window);
                //window.stage.stageWidth = 2000;
            }
        }
    }

как-то так, не проверял, ну а вообще стоит получше разобраться в классах

Добавлено через 1 минуту
хотя всё равно бред, вы в итоге всё равно вызываете в классе самого себяже

Freeman 19.09.2015 13:50

Фишка в том, чтобы использовать статические методы. А динамических может быть сколь угодно.

Например статический класс GUI создаёт элементы интерфейса. К ним у меня нет прямого доступа, статика всё делает через свои методы, следит за их количеством, свойствами и т.п. Очень удобно, использовал таким образом, упрощало всё, алгоритмическая инкапсуляция замечательная.

Но вот, подобные мелочи, что описаны тут, слегка нервируют, заставляют искать видимые костыли.

Пример и вопрос, заключаются в том, чтобы использовать именно статический метод, для работы внутри статики с динамическими методами, не открывая их для пользователя.

samana 19.09.2015 15:18

Почему бы не передать stage по ссылке например при создании окна. Либо сделать статическое свойство stage в классе Window и в начале программы задать ему значение:
Код AS3:

Window.stage = stage;

Но вам нужно посмотреть в сторону шаблона "фабрика". Суть в том, чтобы статический метод, просто создавал и возвращал нужный вам объект, например:

создатель окон
Код AS3:

public class WindowCreator
{
        public static var stage:Stage;
 
        public static function createWindow():Window
        {
                // создаёте окно и всё что нужно,
                // можно даже использовать переданный stage (вдруг)
                var win:Window        = new Window();
                win.x = WindowCreator.stage + 400;
                return win;
        }
 
}

Main
Код AS3:

public class Main extends Sprite 
{
 
        public function Main()
        {
                WindowCreator.stage = stage;
                var w:Window = WindowCreator.createWindow();
                addChild(w);
        }
 
}


Freeman 20.09.2015 02:24

samana, спасибо, использовал передачу ссылки на stage в глобальную переменную, теперь её видят все, с защитой от перезаписи.


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

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