2010-01-02 3 views
0

Я пытаюсь добавить некоторые объекты Sprite как содержимое массива, и я хотел бы иметь возможность «очистить» их от сцены. Я бы предположил, что если есть грузчики участие, мне нужно сделатьAS3: удаление объектов по заданию элемента массива

_imgArray[i].close(); 
_imgArray[i].unload(); 

И если я использую спрайт, я не могу сделать:

removeChild(_imgArray[i]); 

Ни один из указанных работ. ЗАЧЕМ???

Для примера и/или описания того, как я это устанавливаю, см. Сообщение Джоэля here ... но учтите, что он не включил ссылку для удаления их из представления.

В настоящее время я пытаюсь:

for(i = 0; i < _localXML.length(); i++) 
{ 
    var tmp:BMLink = new BMLink(_localXML[i], _bw, _bh, i); 
    _imgArray[i] = tmp; 
    _imgArray[i].x = (_bw + _mainpad) * i; 
    _base.addChild(_imgArray[i]); 
} 

Но это не работает. Мне бы это понравилось, если бы кто-нибудь мог объяснить мне, почему это не будет правильным синтаксисом. экземпляров классов, которые обитающие массив всех расширения спрайта, но у них есть свои собственные индивидуальные погрузчики в ж/о ходе событий и т.д.

Jml

+0

Следует отметить, что все BMLink() все правильно рисуют, но по какой-то причине я не могу их удалить. – jml

+1

при попытке удалить объекты, которые вы собираетесь _base.removeChild (_imgArray [i]); правильно? – Allan

+0

Нет, меня не было! И это именно то, что привело меня в беду. Я полностью забыл, что ... См. Мой ответ ниже и, пожалуйста, отметьте его правильно, если вы это чувствуете. – jml

ответ

0

OK; Я, наконец, понял это через кучу проб и ошибок. Кажется, что я пытался удалить ребенка из моего основного класса спрайта (этого), а не под-спрайт, к которому я добавил детей.

Извините за шум, но и для записи, если вы обнаружите, что вы не можете сделать

this.removeChild(_imgArray[i]); 

это не потому, что вы не имеете правильный синтаксис, но потому, что вы не можете иметь

_imgArray[i] 

в этой конкретной точке списка отображения иерархии ... так ...

_base.removeChild(_imgArray[i]); 

... работал в этом са как таковые.

jml

+0

Я отредактировал свой ответ, чтобы немного объяснить свой комментарий, поэтому, если вы попробуете, почему я предлагаю вам, где это произошло? Благодарю. – Patrick

0

Вы можете сделать интерфейс IDestroy, например, с помощью метода уничтожения, который будет управлять всеми очистки/удаления вещи:

public interface IDestroy{ 
function destroy():void; 
} 

public class MySprite extends Sprite implements IDestroy { 
.. 
public function destroy():void{ 
    // remove events 
    .. 
    // remove loader 
    .. 
    //remove from parent 
    if (parent!==null){ 
    parent.removeChild(this); 
    } 
    // etc.. more cleaning 
} 
} 

тогда, когда у вас есть объект, который является экземпляром IDestroy вы можете вызвать метод уничтожения

if (myObject is IDestroy){ 
IDestroy(myObject).destroy(); 
} 

или иначе

var id:IDestroy=myObject as IDestroy; 
if (id!==null) 
    id.destroy(); 

Edit:

Я не понимаю, почему любой из метода я дал вам в комментарии не будут работать, но _base.removeChild(_imgArray[i]) будет:

addChild и removeChild принимают только a DisplayObject в качестве параметра, поэтому, если вы можете сделать _base.addChild(_imgArray[i]), это означает, что _imgArray[i]наследуется от DisplayObject и _imgArra y [i] имеет родителя.

Так var myDisplayObject:DisplayObject=_imgArray[i] as DisplayObject; не возвратит нуля, и вы будете в состоянии TODO myDisplayObject.parent.removeChild(myDisplayObject); который является общим подходом к вашей проблеме, не полагаясь на своем _Образы базового DisplayObjectContainer (MovieClip/Sprite/...)

+0

Для удаления дочернего из вашего массива (предположим, что ваш экранный объект находится в массиве?): ' var myDisplayObject: DisplayObject = _sprArray [i] as DisplayObject; if (myDisplayObject! == null) { if (myDisplayIObject.parent! == null) { myDisplayObject.parent.removeChild (myDisplayObject); } } ' – Patrick

+0

ОК, но это не работает, потому что я хотел бы создать экземпляр конструктора для этого. В моем случае код выглядит так: var tmp: BMLink = _imgArray [i] как BMLink (_localXML [i], _bw, _bh, i); Что я могу изменить? – jml

+0

Если _imgArray [i] содержит класс, который вы можете сделать: новый BMLink (_imgArray [i]) (_ localXML [i], _bw, _bh, i) – Patrick

Смежные вопросы