Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как обращаться к child'ам мувиклипа в FlashDevelop (http://www.flasher.ru/forum/showthread.php?t=178812)

heartless 29.04.2012 16:26

как обращаться к child'ам мувиклипа в FlashDevelop
 
такая проблема, IDE видит кнопочки, поля и тд на поточном спрайте, а FD - нет
делаю так:
Код AS3:

        public class MyMovieClip extends Sprite 
 
...............................
 
                public function func(e:Event = null):void
                {
                        var pb:DisplayObject;
                        pb = DisplayObject(getChildByName("Btn"));
                        TextField(pb).visible = false;
                }

тоесть, в библиотеке ИДЕ есть MyMovieClip (выше его класс) с текстовым полем, у которой имя Btn
в итоге вылетаю в функции func, потому что pb == null.

Хочу спросить у опытных пользователей FD, как проще реализовать доступ к таким елементам

КорДум 29.04.2012 16:32

Код AS3:

public class MyMovieClip extends Sprite

Спрайт по умолчанию пуст. В нем нет детей. Откуда тогда взяться "Btn"?
Насколько я понял по первой фразе, вы пишете проект на чистом as3 и компилите через FlexSDK с его mxmlc. Графика вся в swc?

heartless 29.04.2012 16:39

да, графика в swc, а пишу в FD.

КорДум 29.04.2012 16:41

Тогда либо композиция, то есть внутри этого класса создавать графический ассет и стучаться к его чайлдам. Либо наследоваться не от спрайта, а от класса граф.ассета.

heartless 29.04.2012 16:52

а как быть там где структура вот такая: class1 extends class2 extends Sprite ? только композиция?

ну и допустим что у меня композиция, так мне каждый раз нужно писать это
Код AS3:

var pb:DisplayObject;
pb = DisplayObject(getChildByName("Btn"));
TextField(pb).visible = false;

???
Нету кода, который сам создаст ссылки, или что-то подобное?

КорДум 29.04.2012 16:59

В данном случае только композиция. Опять говорю, в as3 нет множественного наследования.
Если этот кусок кода нужно писать во всех потомках, то может стоит его поместить в родительский класс?

heartless 29.04.2012 17:00

а как перебрать все елементы на спрайте и узнать для каждого его уникальное имя в коде?

КорДум 29.04.2012 17:06

Код AS3:

var maxIndex:uint = _sprite.numChildren;
for (var i:uint = 0; i < maxIndex; i++) {
    trace( (_sprite.getChildAt(i) as MovieClip).name );
}

При условии, что там ТОЛЬКО объекты класса MovieClip

AlexFrost 01.05.2012 06:46

Итак. (включаю телепатию на максимум).
1. вы сделали во флеше MovieClip, причём его Linkage - MyMovieClip
2. на этом MovieClip есть Dynamic TextField. у которого Instance Name - Btn.
3. экспортировали библу в swc.
4. закинули библу в проект FD
5. пытаетесь достучаться до Btn, но у вас нифига не выходит.

Если всё верно, то
Код AS3:

public class Main extends Sprite{
private var _myMc:MyMovieClip = new MyMovieClip();
public function Main(){
 addChild(_myMc);
//если меняем текст
 _myMc.Btn.text = "йа кнопочко";
//если нужно тупо сделать tf невидимым
 _myMc.Btn.visible = false;
}
}

НО! такие фишки будут выполняться, если textfield, который вы добавляли в мувик - динамический. и Btn - его Instance Name.

nOobCrafter 01.05.2012 17:35

Цитата:

НО! такие фишки будут выполняться, если textfield, который вы добавляли в мувик - динамический
текстфилд не динамический класс, а мувиклип — да. И то что вы советуете не хорошо, лучше пусть человек сразу выучит как правильно работать с ДО. есть метод getChildByName и через него лучше брать детей, сразу же можно и кастить к чему надо. Пример:
Код AS3:

        public function getMovieClip(name: String): MovieClip {
            return getChildByName(name + "_mc") as MovieClip;
        }
 
 
        public function getSprite(name: String): Sprite {
            return getChildByName(name) as Sprite;
        }
 
 
        public function getTextField(name: String): TextField {
            return getChildByName(name + "_tf") as TextField;
        }
 
 
        public function getTLFTextField(name: String): TLFTextField {
            return getChildByName(name + "_tf") as TLFTextField;
        }
 
 
        public function getShape(name: String): Shape {
            return getChildByName(name) as Shape;
        }
 
 
        public function getChildByName(name: String): DisplayObject {
            if (!view) {
                throw Error("View is null, please set non-null object.");
            }
            return view.getChildByName(name);
        }



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

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