Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   isset и addChild. Существует ли и как проверить. (http://www.flasher.ru/forum/showthread.php?t=185359)

inpost 10.10.2012 23:45

isset и addChild. Существует ли и как проверить.
 
Всем привет. Новичок в флеше, спасибо за понимание.
Я создаю объект:
Код AS3:

var ns_playback:NetStream;
ns_playback = new NetStream(NCs);
ns_playback.play(userInfo.enemy_sex + userInfo.enemy_id);
video_playback = new Video(420, 336);
video_playback.attachNetStream(ns_playback);

Далее по нажатию на кнопку я его добавляю через addChild:
Код AS3:

addChild(video_playback);

Теперь по другому событию я хочу проверить, добавлен ли он на экран, чтобы его убрать. Если пишу просто removeChild - выдаёт ошибка в случае, если не было ранее addChild.
Проверка на if(video_playback) - будет проверять, создан ли объект, а он у меня всегда создан, мне лишь надо показывать или скрывать данный блок по событию.
Может можно как-то давать имя, чтобы потом делать уже проверку по имени?

Wolsh 11.10.2012 00:18

Обычно делают так
Код AS3:

if(this.contains(video_playback)) this.removeChild(video_playback);

или
Код AS3:

if(video_playback.parent == this) this.removeChild(video_playback);


inpost 11.10.2012 02:02

Что-то я делаю не так, видимо. Вот код:

Код AS3:

var loader:Loader;
 
function AddPhoto() {
        //if(loader) {loader = null;}
 
        if(this.contains(loader)) this.removeChild(loader); // Не работает.
 
        loader = new Loader();
        loader.load(new URLRequest("/photo/full/picture.jpg"));
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, cc);
}
 
function cc(e:Event)
{
        var n_width = 460;
        var n_height = 360;
 
        if(loader.height > n_height) {
                loader.height = n_height;
                loader.scaleX = loader.scaleY;
        }
        if(loader.width > n_width) {
                loader.width = n_width;
                loader.scaleY = loader.scaleX;
        }
        loader.x = (stage.stageWidth - loader.width) / 2;
        addChild(loader);
}

Может вместо this использовать stage ? К примеру stage.addChild(loader); И проверку через stage.contains(loader) ? Но это лишь мысли, как верно?

Isfet 11.10.2012 05:35

вы пишите в кадре, и у вас this и stage указывают на stage. По этому можно и так и так.

caseyryan 11.10.2012 07:01

Цитата:

вы пишите в кадре, и у вас this и stage указывают на stage. По этому можно и так и так.
this указывает на документ класс, а не на стейдж

Wolsh 11.10.2012 11:03

1.
Цитата:

// Не работает.
В чем проявляется? Выдает ошибку как и раньше?
2.
Цитата:

loader.load(new URLRequest("/photo/full/picture.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, cc);
Откуда пришла эта мода — подписываться на событие ПОСЛЕ того, как инициировал действие, приводящее к этому событию?
3.
Цитата:

проверять, создан ли объект, а он у меня всегда создан, мне лишь надо показывать или скрывать данный блок по событию.
Зачем тогда Вы каждый раз создаете новый Лоадер:
Цитата:

loader = new Loader();
?
4.
Цитата:

К примеру stage.addChild(loader);
Забудьте навсегда, что где-то видели выражение stage.addChild(). Никогда и ничего не добавляйте на стейдж, он — для экземпляра ДокументКласса, и только.

caseyryan 11.10.2012 11:08

Цитата:

Откуда пришла эта мода — подписываться на событие ПОСЛЕ того, как инициировал действие, приводящее к этому событию?
Мне кажется это пока просто не осозние того, что конкретно происходит в коде. Я когда только начинал писать на ас3 (да и вообще начинал программировать), тоже не понимал и делал часто так же )

PainKiller 11.10.2012 13:20

Цитата:

Забудьте навсегда, что где-то видели выражение stage.addChild(). Никогда и ничего не добавляйте на стейдж, он — для экземпляра ДокументКласса, и только.
извиняюсь за оффтопик, но просто заинтересовало, почему нельзя так делать stage.addChild()? Я иногда добавляю дисплейобжекты сразу на сцену, когда надо, чтобы они гарантированно были сверху, вроде проблем с этим не испытывал.

Wolsh 11.10.2012 14:19

Потому что стейдж не является частью Вашего приложения. Это родительский контейнер, управлять которым из детей, по понятиям ООП — не комильфо (настройки не в счет). Иерархически приложением является Документ-класс. Для того он и ОБЯЗАН быть наследником контейнера, чтобы все дети содержались в нем и не гуляли где ни попадя. Стейдж же представляет флэшплеер, проигрывающий Ваше приложение (Документ-класс). Не надо одновременно проигрывать в нем что-то еще.
Цитата:

чтобы они гарантированно были сверху
Гарантийный срок истечет, как только Вы загрузите внешнюю флэшку собрата по мыслям, которая нашпигует стейдж своими детишками. Аккурат поверх Ваших.
Всего-то и нужно — создать структуру "слоев"-контейнеров заранее, и не нарушать ее, добавляя детей в контейнеры, предназначенные именно для них, и сохраняющие нужную глубину постоянно, как слои в IDE.

PainKiller 11.10.2012 14:26

Wolsh мнение понятно, спасибо что уделили внимание


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

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