Форум 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=204644)

uglan 07.11.2013 18:49

Простой способ определения существования объекта
 
Есть какой-нибудь простой и эффективный способ определения наличия объекта? Пример:
Код AS3:

var tmpObj:objClass;
stage.addEventListener(MouseEvent.MOUSE_DOWN,putObject);
stage.addEventListener(MouseEvent.MOUSE_UP,killObject);
 
function putObject(e:MouseEvent):void{
tmpObj = new objClass();
addChild(tmpObj);
setTimeout(destroyer,3000);
}
function destroyer():void{
if(!tmpObj) return; // не работает
tmpObj.parent.removeChild(tmpObj);
}
function killObject(e:MouseEvent):void{
if(tmpObj!=null) return; // не работает
tmpObj.parent.removeChild(tmpObj);
}

Можно, конечно, воспользоваться getChildByName, например, но хочется какой-то более простой способ.

alexandrratush 07.11.2013 19:10

Вот этот метод используйте
http://help.adobe.com/ru_RU/FlashPla...html#contains()

caseyryan 07.11.2013 19:10

Вот так надо написать:
Код AS3:

function killObject(e:MouseEvent):void{
if(tmpObj == null) return;
tmpObj.parent.removeChild(tmpObj);
}

;)

Переводя на человеческий язык, в этом методе у вас было
Код AS3:

если (ссылка на объект существует) обрываем функцию;

естественно ссылка жива, и до tmpObj.parent.removeChild(tmpObj); исполнение не доходит
Цитата:

Сообщение от alexandrratush (Сообщение 1151552)
Вот этот метод используйте
http://help.adobe.com/ru_RU/FlashPla...html#contains()

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

alexandrratush 07.11.2013 19:11

В вашем случае нужно проверять добавлен ли объект на сцену.

uglan 07.11.2013 19:20

Код AS3:

function killObject(e:MouseEvent):void{
if(tmpObj == null) return;
tmpObj.parent.removeChild(tmpObj);
}

Такой способ тоже не работает(
Contains спасает, но он срабатывает также на вновь созданные инстансы. Там у меня setTimer стоит который вырубает объект созданный повторно...

Anton Riot 07.11.2013 22:35

Цитата:

Сообщение от uglan (Сообщение 1151550)
Есть какой-нибудь простой и эффективный способ определения наличия объекта?

Код AS3:

if(tmpObj.parent != null) {
  tmpObj.parent.removeChild(tmpObj);
}


uglan 08.11.2013 00:05

Цитата:

Сообщение от Anton Riot (Сообщение 1151591)
Код AS3:

if(tmpObj.parent != null) {
  tmpObj.parent.removeChild(tmpObj);
}


Неа! Очень хотелось бы чтобы этот или подобные им работали но...
TypeError: Error #1009: Cannot access a property or method of a null object reference.

Пока лидирует contains, но это из той же области что и getChildByName. Неужели нет никакого простого способа?

Anton Riot 08.11.2013 00:21

разберитесь, что вы хотите проверять.
Код AS3:

if(tmpObj.parent != null) {
//есть ли tmpObj на сцене
}

Код AS3:

if(tmpObj != null) {
//есть ли tmpObj в памяти
}

Добавлено через 40 секунд
Код AS3:

if((tmpObj != null) && (tmpObj.parent != null)) {
//есть ли tmpObj в памяти и на сцене
}


uglan 08.11.2013 00:33

О! Вот этот способ работает!)
Код AS3:

if((tmpObj != null) && (tmpObj.parent != null)) {...

У меня вылетает описанная выше ошибка при попытке обратиться к объекту который еще не был создан(не инициализирован и не добавлен в сцену) или уже удален, соответственно я ищу способ как это обойти. На что конкретно ругается флеш мне не понятно толи на отсутствие объекта в сцене то ли на его отсутствие в памяти. Однако если принудительно не обнулять(tmpObj=null) объект остается в памяти, так?

И еще не совсем понимаю почему tmpObj.parent!=null проверяет наличие объекта в сцене. Я и раньше сталкивался с таким примером, но в этом случае мы ведь получается проверяем существует ли родитель tmpObj а не сам объект? Разве нет?

caseyryan 08.11.2013 07:53

Цитата:

Сообщение от Anton Riot (Сообщение 1151597)
разберитесь, что вы хотите проверять.
Код AS3:

if(tmpObj.parent != null) {
//есть ли tmpObj на сцене
}

Код AS3:

if(tmpObj != null) {
//есть ли tmpObj в памяти
}

Добавлено через 40 секунд
Код AS3:

if((tmpObj != null) && (tmpObj.parent != null)) {
//есть ли tmpObj в памяти и на сцене
}


Anton Riot, наличие у объекта родителя, еще не говорит о том, что он есть на сцене. Есть он на сцене или нет можно проверить так:
Код AS3:

if (tmpObj.stage != null) trace("на сцене");

но не так
Код AS3:

if (tmpObj.parent != null) trace("на сцене?");

uglan, вам показали рабочие способы. Вам стоит определить куда же все-таки добавляется объект и откуда он удаляется. Это должен быть один и тот же контейнер, чтобы все работало.
п.с. Ни один из способов не показывает наличие / отсутствие объекта в памяти. Это лишь проверка наличия ссылки на него


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

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