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

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

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

Регистрация: Jul 2011
Сообщений: 7
Question Как правильно удалить мувики?

Рад всех приветствовать.
Возник вопрос: Как правильно удалять дочерние элементы со сцены при определенных условиях?
Или точнее как к ним обратиться, что бы удалить со сцены.
В интернете я не нашел ни одного наглядного примера более или менее подходящего под мою ситуацию.
Как добавлять мувики – примеров полно, а вот как удалять – особо ничего нет.
Вот добавляю мувики на сцену и удаляю их по клику – все удаляется нормально:
Код AS3:
for (var i:int = 0; i < 10; i ++)
{
	var temp1:MovieClip = new clip();
 
	temp1.x = Math.random() * 400;	
	temp1.y = Math.random() * 400;
 
	temp1.addEventListener(MouseEvent.CLICK, del);
 
	allClips.push(temp1);
 
	trace (allClips.length);
}
	for (var n:int = 0; n<allClips.length;n++)
	{
		addChild(allClips[n]);
	}
 
 
function del(e:MouseEvent):void
{
	obj = MovieClip(e.target);
	removeChild(obj);
}
А вот фрагмент кода, где мне их нужно удалить при условии выхода за "границу".

Код AS3:
temp1.addEventListener(Event.ENTER_FRAME, mov);
 
function mov(e:Event):void
{
	var nClip:MovieClip;
	for (var i:int = 0; I < allClips.length; i++)
	{
		allClips[i].x = allClips[i].x - speed;
		nClip = MovieClip(e.target);
		if (allClips[i].x < 100)
		{
			container.removeChild(allClips[i]);
		}
	}
 
}
И вот здесь Flash ругается, что удаляемый элемент должен являться дочерним по отношению к вызывающему.
А вот кто тут кто я не пойму.
Наверняка ведь есть оптимальный способ удаления (если есть способ добавления).
Подскажите, как удалить определенные мувики со сцены.
А если их будет очень много?
Надо их как - то по мере продвижения ликвидировать.
А как я не знаю.

Старый 29.08.2011, 01:43
ЗлОй ПрОграММер вне форума Посмотреть профиль Отправить личное сообщение для ЗлОй ПрОграММер Найти все сообщения от ЗлОй ПрОграММер
  № 2  
Ответить с цитированием
ЗлОй ПрОграММер

Регистрация: Nov 2010
Сообщений: 434
Попробуйте так
Код AS3:
temp1.addEventListener(Event.ENTER_FRAME, mov);
 
function mov(e:Event):void
{
	var nClip:MovieClip;
	for (var i:int = 0; I < allClips.length; i++)
	{
		allClips[i].x = allClips[i].x - speed;
		nClip = MovieClip(e.target);
		if (allClips[i].x < 100)
		{
		       if (allClips[i].parent != null) 
                       {
                            allClips[i].parent.removeChild(allClips[i]);
                       }
 
		}
	}
}

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

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Не читал но поправлю сразу - не надо много if ов. в данном коде
Код AS3:
function mov(e:Event):void
{
	var nClip:MovieClip;
	for (var i:int = 0; I < allClips.length; i++)
	{
		allClips[i].x = allClips[i].x - speed;
		nClip = MovieClip(e.target);
                const bool:Boolean = allClips[i].x < 100 && allClips[i].parent != null;
		if (bool)
		{
 
                     allClips[i].parent.removeChild(allClips[i]);
 
		}
	}
}
Пишите красиво...
__________________
Марк Tween

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
из массива удалять не забывайте!
прям дежавю какое-то
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 29.08.2011, 10:20
interoad вне форума Посмотреть профиль Отправить личное сообщение для interoad Найти все сообщения от interoad
  № 5  
Ответить с цитированием
interoad

Регистрация: Jul 2011
Сообщений: 7
Большое всем спасибо.
И ваше замечание уважаемый cleptoman вполне заслуженно и справедливо.
Я читал Ваши ответы в этой теме форума и согласитесь, что там не совсем то о чем я спрашиваю.
И Ваши ответы про необходимость удаления из массивов я тоже читал.
Вы там объясняете как все прикончить без разбора, а мене это не нужно.
В данной теме затрагивается вопрос не столько удаления а скорее обращения к "размножившимся" клипам.
Может подскажете такую вещь:
При удалении из массива при помощи delete в массиве остаются пустые строки равные Null при обращении к которым опять же возникает ошибка.
Или я опять чего-то не правильно делаю?

Большое спасибо за участие.

Старый 29.08.2011, 10:58
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Используйте Array#splice().
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 29.08.2011, 11:56
dmitry bond вне форума Посмотреть профиль Отправить личное сообщение для dmitry bond Найти все сообщения от dmitry bond
  № 7  
Ответить с цитированием
dmitry bond
 
Аватар для dmitry bond

Регистрация: Jan 2010
Адрес: владивосток
Сообщений: 250
Такая же проблемма была, исправил методом splice();

Старый 29.08.2011, 20:19
interoad вне форума Посмотреть профиль Отправить личное сообщение для interoad Найти все сообщения от interoad
  № 8  
Ответить с цитированием
interoad

Регистрация: Jul 2011
Сообщений: 7
Цитата:
Сообщение от dmitry bond Посмотреть сообщение
Такая же проблемма была, исправил методом splice();
Чего-то у меня не splice-ется, ни shift-ается.
И вобще стоит чего-нибудь удалить из массива, как сразу все перестает работать. Я и не думал, что удалить элимент еще сложнее чем добавить. (когда не знаешь как).
Есть видь не один способ удалить элемент из массива, но все они заканчиваются крахом.
Работает только если заменить ненужную часть на null. Но тогда Пустые индексы массива разрастаются до бесконечности. И получается на сцене 3-4 мувика а массив длиной аж под 1000!.
Стоит их убрать и все виснет.
Вот только в таком корявом виде кое-как работает.

Код AS3:
// Выше только мувики добавляются в массив и на сцену.
 
stage.addEventListener(Event.ENTER_FRAME, mov);
var t:int =0;
function mov(e:Event):void
{
	for (var i:int = 0; i < сlips.length; i++)
	{
		if (сlips[i] != null)    // Если аргумент не равен "0" если убрать то каюк
		{
		сlips[i].x = сlips[i].x - speed;
 
                const all:Boolean = сlips[i].x < 20 && сlips[i].parent != null;
		if (all)
		{
 
					сlips[i].parent.removeChild(сlips[i]);
 
		// Вот с этого момента все перекашивает			
 
					сlips.splice(t, 1, null);
					resultt = [сlips.filter( removeEmpty )];
					t++;
		}
		}
	}
}
function removeEmpty(a:Object,index:int, source:Array):Boolean {
	if ( !a ) return false;
	return true;
}
Вобщем может есть более-менее адекватный способ, что бы функция не "следила" и не "мусорила"?
result - получается замечательный. Вот только присвоить его clips ни как не представляется возможным.

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

блогер
Регистрация: Mar 2007
Сообщений: 1,291
Записей в блоге: 5
Отправить сообщение для cleptoman с помощью ICQ
Код AS3:
if (all)	{
 
	сlips[i].parent.removeChild(сlips[i]);
	сlips.splice(i, 1);
}
__________________
http://cleptoman.free-lance.ru
achivements: дважды благословлен на воровство. осеяный благодатью

Старый 30.08.2011, 20:49
interoad вне форума Посмотреть профиль Отправить личное сообщение для interoad Найти все сообщения от interoad
  № 10  
Ответить с цитированием
interoad

Регистрация: Jul 2011
Сообщений: 7
Спасибо большое.
Этот способ вполне приемлемо работает.
Правда я уже с огромным скрипом сам до этого варианта до рыдся, но все равно огромное всем спасибо за участие!
Вы все мне очень помогли.
Правда теперь все мувики перестали удаляться по клику.
Я просто не знаю как к ним теперь обратиться чтобы удалить.
До читски массива все вроде работало нормально. А теперь кто есть кто не понятно.
Код AS3:
function addClip(e:TimerEvent):void {        
 
		for (i = 0; i < сlips.length; i++)
		{
			trace(сlips.length);
			var child:square = new square;		
			if(сlips[i] == 0)       // Ищю пустые места и вставляю туда Новые клипы
			{
				сlips[i] = child;
 
				сlips[i].x = 500;
				сlips[i].y = Math.random() * 400;
                      // Добавляю слушателя чилду и помещяю на сцену
				сlips[i].addEventListener(MouseEvent.MOUSE_DOWN, delMovClip);
				stage.addChild(сlips[i]);
			}
		}
}
stage.addEventListener(Event.ENTER_FRAME, mov);
// здесь клип двигается 
 
function mov(e:Event):void
{
	for (var i:int = 0; i < сlips.length; i++)
	{
		if (сlips[i] != 0)
		{
		сlips[i].x = сlips[i].x - speed;
		// здесь клип удаляется
                const all:Boolean = сlips[i].x < 20 && сlips[i].parent != null;
		if (all)
		{
 
					сlips[i].parent.removeChild(сlips[i]);
					сlips.splice(i, 1, 0);
 
		}
		}
	}
}
	function delMovClip(e:MouseEvent):void {
 
           ???????.removeChild(??????); // А вот здесь я впал в ступор
// Как не обращусь пише, что объект не имеет свойств или еще чего-нить
}
Вы особо не смейтесь. Просто я еще плохо ориентируюсь в этом языке и по этому и обращаюсь с такими пустяковыми вопросами.
По моему в As главное знать как правильно обратиться к нужному объекту, а остальное все дело техники.
А вот именно это-то до меня чего - то туго доходит.
Кто дочерний, кто не дочерний и если он ползает по сцене, то почему он не дочерний stage?
Ладно. по тихоньку разберусь, а пока надеюсь, что Вы не откажете в совете время от времени.

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

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

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


 


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


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