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

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

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

Регистрация: Dec 2012
Сообщений: 6
По умолчанию Объекты и "дети"

День добрый,
Господа объясните в чем различие между:

Код AS3:
this.addChild(new Symbol1());
и

Код AS3:
var smb:Symbol1 = new Symbol1();
this.addChild(smb);
а также как правильно удалить созданный объект в обоих случаях?

Старый 26.12.2012, 13:11
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
Тем, что во втором случае создается временная ссылка на объект, что позволит с объектом что-то сделать, например задать другие координаты, или сменить уровень прозрачности.

Удалить в первом случаи объект может быть проблематично, так как не известно, он один там или несколько. Если один, то просто
Код AS3:
removeChildeAt (0)
Если несколько и удалить нужно конкретный объект, то не имея на него ссылки, индекса глубины или имени, не получится. Поэтому, используя второй вариант, можно сохранить ссылку на объект (например в переменной класса, а не в локальной как сейчас, или в массиве) и потом по ней удалить.
Код AS3:
removeChild (ссылка)
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 26.12.2012, 16:35
GknTnm вне форума Посмотреть профиль Отправить личное сообщение для GknTnm Найти все сообщения от GknTnm
  № 3  
Ответить с цитированием
GknTnm

Регистрация: Dec 2012
Сообщений: 6
Спасибо за ответ.

Просто пытаюсь написать "менеджер объектов" и хочется сделать это красиво.

т.е. строкой
Код AS3:
var smb:Symbol1 = new Symbol1();
мы всего лишь указываем что smb будет хранить ссылку на объект, а не сам объект.

возможно ли создать объект который не будет иметь на себя ссылки и не быть чьим либо потомком?
я так понимаю возможно:
Код AS3:
var smb:Symbol1 = new Symbol1();
smb = null;
тогда как потом его удалить?

и далее:
попробовал контролировать объекты в сцене следующим образом, создал класс Global.as и создал в нем массив Unit:

Код AS3:
package  {
 
	public class Global {
 
		public static var Unit:Object = [];
 
		public function Global() {
			// constructor code
		}
 
	}
 
}
основному клипу сделал класс main.as

Код AS3:
package  {
 
	import flash.display.MovieClip;
 
	import Global;
 
 
	public class main extends MovieClip {
 
 
		public function main() {
			// constructor code
			Global.Unit[0] = new Symbol1();
			Global.Unit[1] = new Symbol1();
			Global.Unit[2] = new Symbol1();
 
                        //первый
                        trace(Global.Unit[0].numChildren, Global.Unit[2].numChildren);
                        //1 1
 
			this.addChild(Global.Unit[0]);
			Global.Unit[0].addChild(Global.Unit[1]); 
 
                        //второй
                        trace(Global.Unit[0].numChildren, Global.Unit[2].numChildren);
                        //2 1
 
 
 
			this.addChild(Global.Unit[2]);
			Global.Unit[2].addChild(Global.Unit[1]);
 
                        //третий
                        trace(Global.Unit[0].numChildren, Global.Unit[2].numChildren);
                        // 1 2
 
 
			Global.Unit[1].parent.removeChild(Global.Unit[1]);
                        Global.Unit.splice(1,1);
 
 
 
		}
	}
 
}
и сразу возникли вопросы:

первый trace возвращает "1 1"? кто эти дети?

второй и третий trace меня порадовали - т.е. родитель знает сколько у него детей даже если вдруг его ребенку назначить другого родителя он это отследит. Всегда так, или возможны исключения?

Правильно ли удалять ребенка (из любого места и даже другого класса если ему (другому классу) также импортировать Global) следующим образом:

Код AS3:
Global.Unit[1].parent.removeChild(Global.Unit[1]); //удаляем объект
Global.Unit.splice(1,1); //удаляем ссылку на него
?

или есть более элегантный метод удаления объектов?

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

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Цитата:
тогда как потом его удалить?
Если на объект не остается ссылок, то он удаляется GC-ом.
Цитата:
Правильно ли удалять ребенка (из любого места и даже другого класса
Нет. Детей должны убивать родители. Глобальный доступ - источник ошибок и каши в любом проекте.
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 26.12.2012, 17:18
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 5  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Ребёнок просит родителя его удалить, а родитель уже решает, удалять его, или не удалять. Ребёнку, в целом, глубоко пофигу где лежать.
Просить родителя хорошо событием. EventDispatcher#dispatchEvent.

Ещё рекоммендую пользоватья ссылками на полную катушку.
Например, вместо
Код AS3:
trace(Global.Unit[0].numChildren, Global.Unit[2].numChildren);
вот так
Код AS3:
var units:Array = Global.Unit;
units[0].nimChildren, units[2].numChildren
или ещё лучше
Код AS3:
var units:Array = Global.Unit;
var firstUnit:DisplayObjectContainer = units[0];
var secondUnit:DisplayObjectContainer = units[2];
firstUnit.numChildren, secondUnit.numChildren;

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

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

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


 


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


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