![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Jul 2011
Сообщений: 7
|
Рад всех приветствовать.
Возник вопрос: Как правильно удалять дочерние элементы со сцены при определенных условиях? Или точнее как к ним обратиться, что бы удалить со сцены. В интернете я не нашел ни одного наглядного примера более или менее подходящего под мою ситуацию. Как добавлять мувики – примеров полно, а вот как удалять – особо ничего нет. Вот добавляю мувики на сцену и удаляю их по клику – все удаляется нормально: 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); } 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]); } } } А вот кто тут кто я не пойму. Наверняка ведь есть оптимальный способ удаления (если есть способ добавления). Подскажите, как удалить определенные мувики со сцены. А если их будет очень много? Надо их как - то по мере продвижения ликвидировать. А как я не знаю. |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 434
|
Попробуйте так
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]); } } } } |
|
|||||
|
Не читал но поправлю сразу - не надо много if ов. в данном коде
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 |
|
|||||
|
из массива удалять не забывайте!
прям дежавю какое-то
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Регистрация: Jul 2011
Сообщений: 7
|
Большое всем спасибо.
И ваше замечание уважаемый cleptoman вполне заслуженно и справедливо. Я читал Ваши ответы в этой теме форума и согласитесь, что там не совсем то о чем я спрашиваю. И Ваши ответы про необходимость удаления из массивов я тоже читал. Вы там объясняете как все прикончить без разбора, а мене это не нужно. В данной теме затрагивается вопрос не столько удаления а скорее обращения к "размножившимся" клипам. Может подскажете такую вещь: При удалении из массива при помощи delete в массиве остаются пустые строки равные Null при обращении к которым опять же возникает ошибка. Или я опять чего-то не правильно делаю? Большое спасибо за участие. |
|
|||||
|
Регистрация: Jan 2010
Адрес: владивосток
Сообщений: 250
|
Такая же проблемма была, исправил методом splice();
|
|
|||||
|
Регистрация: Jul 2011
Сообщений: 7
|
Чего-то у меня не splice-ется, ни shift-ается.
И вобще стоит чего-нибудь удалить из массива, как сразу все перестает работать. Я и не думал, что удалить элимент еще сложнее чем добавить. (когда не знаешь как). Есть видь не один способ удалить элемент из массива, но все они заканчиваются крахом. Работает только если заменить ненужную часть на null. Но тогда Пустые индексы массива разрастаются до бесконечности. И получается на сцене 3-4 мувика а массив длиной аж под 1000!. Стоит их убрать и все виснет. Вот только в таком корявом виде кое-как работает. // Выше только мувики добавляются в массив и на сцену. 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 ни как не представляется возможным. |
|
|||||
|
__________________
http://cleptoman.free-lance.ru achivements: дважды благословлен на воровство. осеяный благодатью |
|
|||||
|
Регистрация: Jul 2011
Сообщений: 7
|
Спасибо большое.
Этот способ вполне приемлемо работает. Правда я уже с огромным скрипом сам до этого варианта до рыдся, но все равно огромное всем спасибо за участие! Вы все мне очень помогли. Правда теперь все мувики перестали удаляться по клику. Я просто не знаю как к ним теперь обратиться чтобы удалить. До читски массива все вроде работало нормально. А теперь кто есть кто не понятно. 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. |
|
|
« Предыдущая тема | Следующая тема » |
|
|