Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.09.2015, 02:20
Freeman вне форума Посмотреть профиль Отправить личное сообщение для Freeman Найти все сообщения от Freeman
  № 1  
Ответить с цитированием
Freeman
 
Аватар для Freeman

Регистрация: Feb 2014
Сообщений: 56
По умолчанию 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()

Старый 19.09.2015, 03:13
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 2  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Код 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 минуту
хотя всё равно бред, вы в итоге всё равно вызываете в классе самого себяже

Старый 19.09.2015, 13:50
Freeman вне форума Посмотреть профиль Отправить личное сообщение для Freeman Найти все сообщения от Freeman
  № 3  
Ответить с цитированием
Freeman
 
Аватар для Freeman

Регистрация: Feb 2014
Сообщений: 56
Фишка в том, чтобы использовать статические методы. А динамических может быть сколь угодно.

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

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

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


Последний раз редактировалось Freeman; 19.09.2015 в 14:10.
Старый 19.09.2015, 15:18
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 4  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Почему бы не передать 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);
	}
 
}

Старый 20.09.2015, 02:24
Freeman вне форума Посмотреть профиль Отправить личное сообщение для Freeman Найти все сообщения от Freeman
  № 5  
Ответить с цитированием
Freeman
 
Аватар для Freeman

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 22:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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