PDA

Просмотр полной версии : как очистить Sprite?


klafuda_klalafu
26.09.2007, 21:51
создаю спрайт, в нем еще создаю спрайты... а как очистить родительский не удаляя его самого !.....

var ObjSprite:Sprite = new Sprite();
addChild(ObjSprite);

var NSprite:Number = 10//некоторое число которое непостоянно

for(var i:Number = 0; i<NSprite; i++){
with(ObjSprite.addChild(new Sprite())){
x=i*10;
graphics.beginFill(0x000000);
graphics.drawRect(-5,-5,10,10);
graphics.endFill();
}
}
//это все дело пытаюсь очистить вот такой процедурой
for (var i:uint = 0; i<ObjSprite.numChildren; i++) {
ObjSprite.removeChild(ObjSprite.getChildAt(i));
}


не получается один спрайт все таки сотается!....
может есть что нить типа clear????
или еще какая хитрая команда хелп перерыл ничо не нашел вразумительного!

Torero
26.09.2007, 22:30
Млин.. 3 года человек во флеше.. "numChildren+1" попробуй..))

etc
26.09.2007, 22:54
А removeChildAt уже не можно юзать?

var num:uint = ObjSprite.numChildren;
while (num--) {
ObjSprite.removeChildAt(0);
}

__i
27.09.2007, 00:59
иестчо проще

while (ObjSprite.numChildren>0) {
ObjSprite.removeChildAt(0);
}

etc
27.09.2007, 02:30
Проще для кого? :)
Я о машине забочусь, а ты? ;)
Я старался написать максимально простой и быстрый код, а у тебя просто максимально простой :)

__i
02.10.2007, 02:36
а ты пробовал ? :p

Torero
02.10.2007, 02:42
Сорри за оффтоп: а как вы вообще отслеживаете производительность?

DRAGOnoid
02.10.2007, 10:06
можно я тоже поделюсь как я такие задачи решаю? Авось помогут

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

способ 1:
Я создаю массив по типа
public var = itemsArray:Array = new Array();

в который методом push добавляю конструкторы спрайтов мувов или чё хош )

var test = new Sprite();
var test2 = new Sprite();
this.itemsArray.push(test2);
test.addChild(test2);

// далее простым циклом если надо удаляю все спрайты
for each (var item in this.itemsArray)
test.removeChild(item);


второй способ когда внутри спрайта творится полный хаос что даже я незнаю что там происходит ))
в таком случае внутри спрайта заведи подспрайт , в него и добавляй всё. а потом грохни этот подспрайт:


var test = new Sprite();
var test2 = new Sprite();
test.addChild(test2);
var test3 = new Sprite();
test2.addChild(test3);
// как я удаляю обычно (может и не правильно)
removeChild(test2);
test2 = new Sprite();
addChild(test2);

глюков в втором варианте масса! во первых если у вас были какие то addEventListener'ы то они тут же будут выдовать ошибку что такхи объектов нет.

в таком случае я вообще используя перый метод добавил её в функцию которая ещё и листенеры удаляет.

в общем идеи предложил дальше думайте сами, ну или буду рад критике потому что сам эти методы использую а они могут оказаться не верными :rolleyes:

etc
02.10.2007, 10:22
а ты пробовал ? :p
В смысле тест провести? Нет. Лень.

artcraft
02.10.2007, 17:02
мне кажется, что самым быстрым будет вариант не с уделением детей на нулевом уровне, а при уделении от последнего к нулевому
приблизительно по этой причине: http://lab.polygonal.de/wp-content/swf/ds/ArrayExample.swf (это наглядный пример удаления ячеек из массива - вытаскивайте квадратики мышкой из начала)

__i
02.10.2007, 17:32
Сорри за оффтоп: а как вы вообще отслеживаете производительность?



trace(getTimer())
//...твой мега код а еще круче его в цикл завернуть этак на 100000
trace(getTimer())

DRAGOnoid
21.10.2007, 19:38
Здравствуйте

хочу спросить а как вообще очистить спрайт не только от объектов, но и EventListener'ов ?

я тут пытаюсь решить проблему (если это вообще разумно) унаследования одному спрайту разных классов.

т.е. имеентся некий спрайт public var scene:Sprite;

и в дависимости от сценария кода пытаюсь воссоздать сцену которая работает сама по себе:


// очищаю спрайт
var num:uint = this.scene.numChildren;
while (num--) {
this.scene.removeChildAt(0);}
removeChildAt(this.scene); // хотелось бы от этого избавится
switch (this.sceneName) {
case 'SceneLogin' : // сцена залогинивания
this.scene = new SceneLogin(this);
break;
case 'SceneGame' : // сцена игры
this.scene = new SceneGame(this);
break;
default :
trace('Неопределена Сцена!');
}
addChildAt(this.scene, getChildIndex(this.black)); // от этого бы тоже избавиться



извините если что то непонятно переспросите - я просто уже третии сутки не сплю и плохо соображаю =)

с самого начала была задумка создать внутри каждого класса сцены метод del();
this.scene.del();
который бы очищал всё что внутри себя имеет по собственным потребностям.
а можно ли как то обойти это?

MrPoma
22.10.2007, 21:45
у меня тоже есть интересный вопрос по удалению спарйтов:) метод removeChild() удаляет объекты только из дисплэй листа, так? и если имеется ссылка на него то его можно опять куда нить всунуть..

DRAGOnoid
22.10.2007, 22:04
всмысле меняется ссылка? ссылка на объект не может меняться - если ты переменную не потерял то добавлять её можешь куда угодно.

т.е. есть у тебя переменная типа private var test : Sprite = new Sprite(); ты можешь её добавлять хоть
addChild (this.test);
хоть
this.anotheSprite.addChild (this.test);
и т.д.
так что если ты напишешь removeChild(this.test)
сам this.test никуда не пропадёт (к сожалению)

etc
22.10.2007, 22:23
this.test = null;

ALiEN_
24.10.2007, 01:32
Лично я создаю объект и засовываю линк на этот объект в массив. После уже беру из массива, и удаляю. НО!

Может кто подскажет? Как наиболее удобно пришибить листнеры, вместе с объектом? :quiet:

Ведь насколько мне известно, даже при определении ссылки объкта как null - листнеры внутри объекта не дохнут?

Поделитесь советом?

BlooDHounD
24.10.2007, 02:11
читайте про мягкие ссылки

DRAGOnoid
24.10.2007, 02:55
Может кто подскажет? Как наиболее удобно пришибить листнеры, вместе с объектом? :quiet:

Ведь насколько мне известно, даже при определении ссылки объкта как null - листнеры внутри объекта не дохнут?

Поделитесь советом?
сам с этой проблемой морочуюсь - даже где то уже спрашивал про это, но ответа не получил.
пока делаю тупо - в классе создаю метод del() который удаляет все листенеры класса.
а потом можно и null присвоить смело.

читайте про мягкие ссылки
а по подробнее можно?

BlooDHounD
24.10.2007, 03:14
http://www.google.ru/search?q=мягкие+ссылки

DRAGOnoid
24.10.2007, 09:07
прикольно! Спасибо! (как же много ещё узновать приходится)

ALiEN_
24.10.2007, 21:12
Да, мягкие ссылки, то что надо! Спасибо.

DRAGOnoid
18.11.2007, 03:23
извините что сново поднял эту тему, просто наконец решил до неё добраться.

в общем читая данную статью
http://flasher.ru/forum/showpost.php?p=577873&postcount=40
решил как обычно попробовать и проверить что получится


package WAY {
import flash.display.*;
import flash.events.*;
import flash.utils.*;

public class Index extends Sprite {
public function Index ():void {
var dict:Dictionary = new Dictionary(true); // использовать мягкие ссылки
var obj:Sprite = new Sprite();
dict[obj] = true;
obj.addEventListener(Event.ENTER_FRAME, ttt, false, 0, true);
//obj = null;
delete obj; // сборщик мусора удалит объект obj, поскольку ссылка на него из dict мягкая
trace (obj);
}
private function ttt (e:Event):void {
trace (1);
}
}
}


в общем как видете решил заодно проверить удаление события.
но в итоге выдалась ошибка
Warning: 3600: The declared property obj cannot be deleted. To free associated memory, set its value to null.

и событие тоже не удалилось
как я понял нужно превести obj = null; однако это не помогло

посоветуйте пожалуйста.

DRAGOnoid
18.11.2007, 14:30
почему не хочет удаляться

var myVar = 1;
trace(myVar); // 1
delete myVar;
trace(myVar); // 1

хотя она и локальная.
теперь delete вообще не может удалять нормально?

может кто нить пример кинуть где показано простейшее удаление объекта со встроенными слушателями? Мне дествительно очень надо =(

etc
18.11.2007, 14:35
delete работает только для добавленных свойств динамического класса.

silin
18.11.2007, 15:31
>>теперь delete вообще не может удалять нормально?
The delete operator works only on properties of objects, but not on variables that hold references to objects.

>>может кто нить пример кинуть где показано простейшее удаление объекта со встроенными слушателями? Мне дествительно очень надо =(

ну ты же сам ссылался на пост MerlinTwi

спрайт (когда на него не останется ссылок) удалит только GC , но когда - это большой вопрос..
разными хаками можно и спровоцировать это дело :
заставить плеер потратится на память как в примере MerlinTwi
или так еще:
var dict:Dictionary = new Dictionary(true); // использовать мягкие ссылки
var obj:Sprite = new Sprite();
dict[obj] = true;
obj.addEventListener(Event.ENTER_FRAME, ttt, false, 0, true);
obj = null;


function ttt (e:Event):void {
trace (1);
}
addEventListener(MouseEvent.CLICK, forceGC);
function forceGC(evnt:MouseEvent):void{
trace("forceGC");
new LocalConnection().connect("lc");
try{
new LocalConnection().connect("lc");
}catch(e:Error){}
}

etc
18.11.2007, 15:38
silin, надо на stage подписаться.

silin
18.11.2007, 16:25
ну это не универсальное решение, а тока пример, что такой трюк проходит..
в любом случае надо иметь ввиду что это хак и полагаться на него не слишком разумно

_Smirnoff
04.06.2008, 16:16
Соединив алгоритмы i__ vs __etc
var num:uint = ObjSprite.numChildren;
while (num) {
ObjSprite.removeChildAt(--num);
}

Mаксимальная производительность! ;)

korshak
13.06.2008, 16:12
Может оффтоп, но не скажет ли кто: есть ли способ изменять уже нарисованный объект на уровне точек?
И как доступ к точкам объекта?
Курил доку, искал в гугле и на форуме: вроде бы нигде такого нету. Неужто не реализовали?

Alex Lexcuk
13.06.2008, 23:42
Конвертировать в битмап дату. И плющить уже ее по пиксельно.