Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   addChild в другом классе (http://www.flasher.ru/forum/showthread.php?t=155099)

Lesorub 28.04.2011 04:08

addChild в другом классе
 
Столкнулся с проблемкой, скорей всего из за непонимания чего то базового.
Вызываю метод addChild для отображения текстового поля, вызываю из public функции импортированного класса.
Пока это было в основном файле - всё работало и отображалось, перенёс в другой файл с импортом, всё работает но не отображается.
Пробовал stage.addChild(...) - не работает.
Подскажите пожалуйста кто знает.

Cornford 28.04.2011 10:52

точно не уверен но я как думаю, stage может быть только один.
поэтому неглавный класс может принимать параметр stg:Stage, и на него уже делать stg.addChild();

goodguy 28.04.2011 11:03

Цитата:

точно не уверен но я как думаю, stage может быть только один.
свойство stage есть у любого дисплей объекта, но
для того, чтобы удостовериться, что stage != null, перед тем как что-либо добавлять на сцену, нужно использовать Event.ADDED_TO_STAGE
Lesorub, не видя кода, на это вопрос невозможно ответить.
Но скорее всего не создан экземпляр первого класса во втором, или он сам не добавлен в список отображения. Короче говоря, код в студию.

in4core 28.04.2011 11:55

Цитата:

точно не уверен но я как думаю, stage может быть только один.
Так и есть.
Stage - > root - > DO. Стейдж он всегда один, так же как и рут, просто из любого добавленного на сцену объекта, до нее достучаться можно легко.

Lesorub 29.04.2011 03:23

Код, оригинальный слишком большой , накидал пару примеров.

Простой код который работает:
Код AS3:

package
{
        import flash.text.TextField;       
        public class NewClass
        {
                private var ttt:TextField;
                public function NewClass()
                {
                        ttt = new TextField();
                        ttt.x = 250;
                        ttt.y = 235;
                        ttt.text = "Some Smart Text";
                        addChild(ttt);
                }
        }
}


Делаю отдельный файл класса помещаю в папку jjj вызываю из основного файла
Это не работает:
Код AS3:

package jjj 
{
        import flash.text.TextField;
 
        public class testClass
        {
                private var ttt:TextField;
                public function TTT()
                {
                        ttt = new TextField();
                        ttt.x = 250;
                        ttt.y = 235;
                        ttt.text = "Some Smart Text";
                        addChild(ttt);
                }
 
        }
 
}

///////////////////////////////////////////////////
Код AS3:

package 
{                                     
        import flash.display.Sprite;
        import jjj.testClass;
        public class Main extends Sprite
        {
                private var mySmartText:testClass;
                public function Main():void
                {
                    mySmartText = new testClass();       
                    mySmartText.TTT();
                }
        }
}


А вот это заработало ) спасибо Cornford! :
Код AS3:

package jjj 
{
        import flash.display.Stage;
        import flash.text.TextField;
        import flash.display.Sprite;
 
        public class testClass
        {
                private var ttt:TextField;
                public function TTT(stg:Stage):void
                {
                        ttt = new TextField();
                        ttt.x = 250;
                        ttt.y = 235;
                        ttt.text = "Some Smart Text";
                        stg.addChild(ttt);
                }
        }
}

///////////////////////////////////
Код AS3:

package 
{                                     
        import flash.display.Sprite;
        import jjj.testClass;
        public class Main extends Sprite
        {
                private var mySmartText:testClass;
                public function Main():void
                {
                    mySmartText = new testClass();       
                    mySmartText.TTT(stage)
                }
        }
}

Правда не совсем понятен принцип, получается при обращение к функции импортированного класса нельзя напрямую из этой функции добавить в список отображения addChild(ttt); ???

goodguy 29.04.2011 08:20

Взять, например, вот этот код:
Код AS3:

package jjj 
{
        import flash.text.TextField;
 
        public class testClass
        {
                private var ttt:TextField;
                public function TTT()
                {
                        ttt = new TextField();
                        ttt.x = 250;
                        ttt.y = 235;
                        ttt.text = "Some Smart Text";
                        addChild(ttt);
                }
 
        }
 
}

И конкретно метод addChild(ttt);

Куда этот ttt добавляется?

По сути
Код AS3:

addChild() = this.addChild();

А для того, чтобы можно было добавить какой-либо объект внутрь другого объекта, этот другой (родительский) контейнер должен наследовать от DisplayObjectContainer'а

Что мы видим в этом коде?
Код AS3:

public class testClass

От чего он наследует? Object? Естественно ничего не добавится.

Для начала нужно исправить это.
Код AS3:

public class testClass extends Sprite

После этого добавить на сцену экземпляр самого testClass
и уже после этого метод addChild(ttt); сработает как и задумывалось

Lesorub 29.04.2011 14:22

goodguy Спасибо за разьяснения!
сейчас буду тестить

Добавлено через 11 часов 54 минуты
Код AS3:

public class testClass extends Sprite

добавил extends Sprite.
Кампилятор теперь эррор не выдаёт, но всё равно ничего не отображается.

Натолкнулся в интернете, на статейку что так дескать и должно быть, и надо добавлять addChild() в главном файле, что есть крайне не удобно.
(разные stage что ли ??? )
Пока что остановился на методе Cornford_а с пересылкой stage в ипортированный класс.


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

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