Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отслеживание наличия объекта на сцене (http://www.flasher.ru/forum/showthread.php?t=207175)

dendead 28.03.2014 23:38

Отслеживание наличия объекта на сцене
 
Доброго времени суток. Есть функция, которая получает данные с сервера:

Код AS3:

private function loadData(e:Event = null):void {                        
                        var loader:URLLoader = new URLLoader( );
                        var stat_request:URLRequest = new URLRequest("http://localhost/test.php");
                        stat_request.method = URLRequestMethod.POST;
                        loader.dataFormat = URLLoaderDataFormat.TEXT;
 
                        var vars:URLVariables = new URLVariables( );
                        vars['do'] = "get";
                        stat_request.data = vars;
                        loader.load(stat_request);
                        loader.addEventListener(Event.COMPLETE, onComplete);
                }

При успешной загрузке вызывается функция, которая инициирует создание других классов и добавление объектов на сцену:

Код AS3:

private function onComplete(e:Event):void {
createData( );
e.target.removeEventListener(Event.COMPLETE, onComplete);
}

В функции createData( ) создаю и добавляю на сцену объекты:

Код AS3:

mView = new MV();
stage.addChild(mView);

Требуется при нажатии на кнопку, повторно вызвать загрузчик и получать данные с сервера, уже с другими параметрами. Не придумал ничего другого, как отправлять событие из другого класса и ловить его loadData(e:Event = null). Проблема в том, что при очередном срабатывании кнопки, все данные загружаются с сервера, но вот объект mView добавляется поверх существующего. Попытки отловить его наличие на сцене и удалить не привенчали к успеху. Хотя объект и виден в проигрывателе. В трейсе вот что:

Код AS3:

trace(stage.contains(mView))// false
mView = new MV();
stage.addChild(mView);
trace(stage.contains(mView))// true

При повторной загрузке в трейсе тоже самое.

alexandrratush 29.03.2014 00:26

вы хотите чтобы объект mView добавлялся только один раз?
Тогда так можно сделать:
Код AS3:

// Если объект не инициализирован 
if (mView == null) {
    mView = new MV();
    stage.addChild(mView);
}


dendead 29.03.2014 00:37

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

Требуется добавить объект, а при следующей загрузке очистить сцену и добавить новый объект.

Добавлено через 16 минут
В этом то и проблема, что объект отображается на сцене, код этого не показывает.

samana 29.03.2014 01:32

Тогда добавьте проверку, если mView не нуль и если у него есть родитель, то удаляйте mView из его родителя.

dendead 29.03.2014 02:11

alexandrratush, samana, спасибо. Буду пробовать.

caseyryan 29.03.2014 07:55

Советую забыть про метод contains, Так как он работает совсем не так, как нужно. Он вернет true, даже если объект лежит в другом контейнере, а этот контейнер добавлен в другой контейнер у которого вызывается contains.
Лучше проверять так:
Код AS3:

if (mView && mView.parent) {
  mView.parent.removeChild(mView);
  mView = null;
}

Этот способ гарантировано сработает.
П.с. наверняка найдутся те, кто сейчас скажет, что мол не должен дочерний объект управлять родителем и что это нарушение инкапсуляции и т.д. Но вот это как раз тот случай, когда лучшего варианта не предложат.
Я лично всегда таким способом пользуюсь, и мне пофиг кто там что думает)


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

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