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

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

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

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
По умолчанию изменение this, root и stage при создании экземпляра класса

в Main создаю экземпляр DO класса:

Код AS3:
 
public class Main extends Sprite
	{
		private var _staticObjects:StaticObjects = new StaticObjects;
 
		public function Main() 
		{
			addChild(_staticObjects);
сам класс StaticObjects имеет вид:

Код AS3:
 
package  
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;
 
	public class StaticObjects extends Sprite
	{
		private var _stageHeader:TextField =  new TextField();
 
		public function StaticObjects() 
		{
 
			var tf:TextFormat = new TextFormat();
			tf.align = "center";
			tf.font = "Arial";
			tf.size = 20;
 
			_stageHeader.text = "Прочитанный материал по ActionScript 3.0";
			_stageHeader.textColor = 0xFFFFFF;
			_stageHeader.border = true;
			_stageHeader.borderColor = 0x8000FF;
			_stageHeader.setTextFormat(tf);
			_stageHeader.width = _stageHeader.textWidth+5;
			_stageHeader.height = 25;
 
			addChild(_stageHeader);
 
			trace (this.parent); //null
			trace (this.root); //null
			trace (stage); // null
 
		}
 
	}
 
}
не совсем понимаю почему все 3 трейса при создании экземпляра класса выводят null? конструктор класса StaticObjects, получается, вызывается же только когда в Main создаётся объект _stageHeader?

я думал, что trace(this.parent) в классе StaticObjects будет тоже самое, что и _stageHeader.parent в классе Main (создаётся же объект в Main)


Последний раз редактировалось nelco; 23.09.2015 в 20:52.
Старый 23.09.2015, 21:33
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 2  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Конструктор класса срабатывает при создании экземпляра этого класса. То-есть когда срабатывает конструктор, ваш экземпляр класса ещё не находится на сцене, от того его родитель, stage и root не имеют значений.

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

Регистрация: Jun 2014
Сообщений: 558
Код AS3:
addEventListener(Event.ADDED_TO_STAGE, init);
вам в помощь

Старый 24.09.2015, 06:51
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 4  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
nelco, вот эта запись
Код AS3:
private var _staticObjects:StaticObjects = new StaticObjects;
моветон сразу по двум причинам:
1) Вызывать конструктор принято с добавлением скобок, даже если он не принимает никаких аргументов
то есть
Код AS3:
new StaticObjects();
а не
Код AS3:
new StaticObjects;
2) Не нужно создавать экземпляры вне конструктора
Это конечно не повляет на работу, но вид кода портит.
Такая запись в работе равнозначна созданию экземпляра в конструкторе или в другом методе

То есть лучше писать так:
Код AS3:
public class Main extends Sprite
	{
		private var _staticObjects:StaticObjects = null;;
 
		public function Main() 
		{
			_staticObjects = new StaticObjects();
			addChild(_staticObjects);
п.с. Ну и название класса должно быть существительным в единственном числе

Старый 24.09.2015, 08:21
Isfet вне форума Посмотреть профиль Отправить личное сообщение для Isfet Найти все сообщения от Isfet
  № 5  
Ответить с цитированием
Isfet

Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
эти ссылки появляются после добавления этого объекта в дисплей лист

Код AS3:
public class Main extends Sprite
	{
		private var _staticObjects:StaticObjects = null;;
 
		public function Main() 
		{
			_staticObjects = new StaticObjects();
			addChild(_staticObjects);
                      //только здесь станут доступны эти ссылки, и если вызвать какую-нибудь функцию в _staticObjects после этого , то там уже можно будет трейсить их
 
                      _staticObjects.traceRef();
но правильней - это подписаться на событие addEventListener(Event.ADDED_TO_STAGE, init);, как сказал neonoviiwolf
а в хэндлере - уже работать со stage

Код AS3:
 
package  
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.text.TextFormat;
 
	public class StaticObjects extends Sprite
	{
		private var _stageHeader:TextField =  new TextField();
 
		public function StaticObjects() 
		{
                       this.addEventListener(Event.ADDED_TO_STAGE, init);
 
 
		}
                public function init(event:Event):void{
 
                        this.removeEventListener(Event.ADDED_TO_STAGE, init);
 
			var tf:TextFormat = new TextFormat();
			tf.align = "center";
			tf.font = "Arial";
			tf.size = 20;
 
			_stageHeader.text = "Прочитанный материал по ActionScript 3.0";
			_stageHeader.textColor = 0xFFFFFF;
			_stageHeader.border = true;
			_stageHeader.borderColor = 0x8000FF;
			_stageHeader.setTextFormat(tf);
			_stageHeader.width = _stageHeader.textWidth+5;
			_stageHeader.height = 25;
 
			addChild(_stageHeader);
 
			trace (this.parent); //null
			trace (this.root); //null
			trace (stage); // null                         
 
                }
 
	}
 
}

Старый 24.09.2015, 11:32
nelco вне форума Посмотреть профиль Отправить личное сообщение для nelco Найти все сообщения от nelco
  № 6  
Ответить с цитированием
nelco
 
Аватар для nelco

Регистрация: Jul 2013
Адрес: Каскелен
Сообщений: 86
спасибо за ответы, понял...
я думал, что если trace() стоит после addChild() в конструкторе добавляемого класса, то к тому времени, как вызовется trace(), addChild() уже выполнится и объект будет в displayListe

буду пробовать с Event.ADDED_TO_STAGE

Старый 24.09.2015, 12:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от nelco Посмотреть сообщение
я думал, что если trace() стоит после addChild() в конструкторе добавляемого класса, то к тому времени, как вызовется trace(), addChild() уже выполнится и объект будет в displayListe
Так и есть. Но тогда и свойства надо тестировать у добавленного объекта, а не у родителя.
То есть не
Код AS3:
addChild(_stageHeader);
 
trace (this.parent); //null
trace (this.root); //null
trace (stage); // null
а
Код AS3:
addChild(_stageHeader);
 
trace (_stageHeader.parent); 
trace (_stageHeader.root); 
trace (_stageHeader.stage);
Добавлено через 3 часа 42 минуты
Но это сработает при условии, что сам родительский контейнер добавлен в дисплей лист

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

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

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


 


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


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