Просмотр полной версии : как очистить 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????
или еще какая хитрая команда хелп перерыл ничо не нашел вразумительного!
Млин.. 3 года человек во флеше.. "numChildren+1" попробуй..))
А removeChildAt уже не можно юзать?
var num:uint = ObjSprite.numChildren;
while (num--) {
ObjSprite.removeChildAt(0);
}
иестчо проще
while (ObjSprite.numChildren>0) {
ObjSprite.removeChildAt(0);
}
Проще для кого? :)
Я о машине забочусь, а ты? ;)
Я старался написать максимально простой и быстрый код, а у тебя просто максимально простой :)
Сорри за оффтоп: а как вы вообще отслеживаете производительность?
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:
а ты пробовал ? :p
В смысле тест провести? Нет. Лень.
artcraft
02.10.2007, 17:02
мне кажется, что самым быстрым будет вариант не с уделением детей на нулевом уровне, а при уделении от последнего к нулевому
приблизительно по этой причине: http://lab.polygonal.de/wp-content/swf/ds/ArrayExample.swf (это наглядный пример удаления ячеек из массива - вытаскивайте квадратики мышкой из начала)
Сорри за оффтоп: а как вы вообще отслеживаете производительность?
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();
который бы очищал всё что внутри себя имеет по собственным потребностям.
а можно ли как то обойти это?
у меня тоже есть интересный вопрос по удалению спарйтов:) метод 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 никуда не пропадёт (к сожалению)
Лично я создаю объект и засовываю линк на этот объект в массив. После уже беру из массива, и удаляю. НО!
Может кто подскажет? Как наиболее удобно пришибить листнеры, вместе с объектом? :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
прикольно! Спасибо! (как же много ещё узновать приходится)
Да, мягкие ссылки, то что надо! Спасибо.
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 вообще не может удалять нормально?
может кто нить пример кинуть где показано простейшее удаление объекта со встроенными слушателями? Мне дествительно очень надо =(
delete работает только для добавленных свойств динамического класса.
>>теперь 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){}
}
silin, надо на stage подписаться.
ну это не универсальное решение, а тока пример, что такой трюк проходит..
в любом случае надо иметь ввиду что это хак и полагаться на него не слишком разумно
_Smirnoff
04.06.2008, 16:16
Соединив алгоритмы i__ vs __etc
var num:uint = ObjSprite.numChildren;
while (num) {
ObjSprite.removeChildAt(--num);
}
Mаксимальная производительность! ;)
Может оффтоп, но не скажет ли кто: есть ли способ изменять уже нарисованный объект на уровне точек?
И как доступ к точкам объекта?
Курил доку, искал в гугле и на форуме: вроде бы нигде такого нету. Неужто не реализовали?
Alex Lexcuk
13.06.2008, 23:42
Конвертировать в битмап дату. И плющить уже ее по пиксельно.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.