Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   После присвоения Stage класса Main не видно публичных методов Main (http://www.flasher.ru/forum/showthread.php?t=184463)

Isfet 19.09.2012 19:56

После присвоения Stage класса Main не видно публичных методов Main
 
Хотел вообще знать как правильно обходиться со stage, покопавшись в нескольких исходниках понял что ей надо в свойствах присваивать класс, но после присвоения у меня в классе Main перестали видиться публичные методы, неужели такая манипуляция (в свойствах stage присваивать класс) делает этот класс статичным?
Если да, то как вызывать методы класса Main? делать их статичными и обращаться через класс?

bav 19.09.2012 20:07

Покажите каким образом вы присвоили stage класс Main (через Document class?). И где теперь не видно публичных методов Main?

Isfet 19.09.2012 20:18

Вложений: 1
вот таким макаром в свойтвах stage прописываем класс
Вложение 28473
потом допустим
Код AS3:

package  classes{
                        import classes.timeScale.TimeScale;
 
}
        public class Main extends Sprite {
                public function Main() {
                        drawTimeScale();
                }
                private function drawTimeScale ():void {
                        var timeScale:TimeScale= new TimeScale(this);
                }
                public function tracer ():void {
                        trace("функция класса Main");
                }
        }
}

Код AS3:

package classes.timeScale {
                import classes.Main;
        public class TimeScale extends TimeScaleDragger {
 
                public function TimeScale(main:Main) {
                        main.addChild(this);
                        main.tracer(); //тут ничего не выводит
                }
        }
}


strangedk 20.09.2012 00:42

Вот всё в точности до наоборот - будет работать :)

Главный класс на то и главный, что он должен всё решать и всем руководить.

Что вам мешает сделать так:
Код AS3:

package classes {
 
        public class Main extends Sprite {
                public function Main() {
                        drawTimeScale();
                }
                private function drawTimeScale ():void {
                        var timeScale:TimeScale= new TimeScale();
                        addChild(timeScale);
 
                        tracer();
                }
                public function tracer ():void {
                        trace("функция класса Main");
                }
        }
}

Добавлено через 1 минуту
Речь о том, что это одно и то же по факту

Код AS3:

addChild(timeScale);

в классе Main, и
Код AS3:

main.addChild(this);

в классе TimeScale

Только это ОЧЕНЬ плохая практика, когда объект сам себя добавляет куда-то

Isfet 20.09.2012 04:48

Код AS3:

package  classes{
        import classes.timeScale.TimeScale;
            import classes.dateScale.DateScale;
 
        public class Main extends Sprite {
        private var dateScale:DateScale;
                public function Main() {
                        drawTimeScale();
                                      drawDateScale();
                }
                private function drawTimeScale ():void {
                        var timeScale:TimeScale= new TimeScale();
                                      addChild(timeScale);
                }
                        private function drawDateScale ():void {
                        this.dateScale = new DateScale();
                                      addChild(dateScale);
                }
                public function getVarFromDateScale ():void {
                        this.dateScale.getValue();
                }
        }
}

Код AS3:

package classes.timeScale {
                import classes.Main;
        public class TimeScale extends TimeScaleDragger {
 
                public function TimeScale() {
 
                      var obj1:Obj1 = new Obj1();
                                this.addChild(obj1);
                }
        }
}

Код AS3:

package classes.timeScale {
        public class Obj1 extends Sprite {
 
                public function Obj1() {
 
                      var obj2:Obj2 = new Obj2();
                        this.addChild(obj2);
                }
        }
}

Код AS3:

package classes.timeScale {
        public class Obj2 extends Sprite {
 
                public function Obj2() {
                        this.addEventListener(MouseEvent.CLICK,onMClick);
                }
                public function onMClick(e:MouseEvent) {
 
                        (this.root as Main).getVarFromDateScale();//здесь не видно функции getVarFromDateScale()
                }
        }
}

//то есть изначально все делалось для того чтобы я из класса в глубине мог обратиться сразу к Main(чтобы root указывал на Main, а не на Stage), мне нужно из класса, который лежит в Main вытащить какое-либо значение. Как такое осуществляется? Читал где то что нужно ссылку на Main передавать напрямую в конструкторы, и не обращатся через root. Пдскажите как по правильному?

fish_r 20.09.2012 07:36

В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен null, то есть его фактически не существует. Инициализация объекта заканчивается тогда когда выполнится конструктор,и методы указанные в конструкторе ( а если в нем указана инициализация нижележащих объектов то и их конструкторы и методы указанные в них ). После этого можно обратиться уже к Майн, как к объекту.

По поводу второго примера strangedk вам уже подсказал, что обращаться из дочерних классов в родительские не корректно. Это создает проблемы при импорте в другие проекты и при отладке.
Чаще всего это решается диспатчем события из дочернего объекта о том, что его сост. изменилось. Родительский объект получает это событие и решает что в связи с этим он должен делать как и чье состояние он должен изменить и т.д.

Isfet 20.09.2012 08:22

а можете поправить мой код,чтобы было понятно, как нужно диспатчить клик Child-а, и как потом вызывать функцию Main класса?

silin 20.09.2012 09:48

Цитата:

Сообщение от fish_r (Сообщение 1096731)
В первом приведенном вами примере вы обращаетесь к Майн до конца инициализации, а он в это время ещё равен null, то есть его фактически не существует. Инициализация объекта заканчивается тогда когда выполнится конструктор,и методы указанные в конструкторе ( а если в нем указана инициализация нижележащих объектов то и их конструкторы и методы указанные в них ). После этого можно обратиться уже к Майн, как к объекту.

однако небольшой эксперимент показывает, что это не так
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
 
                public function Main():void
                {
                        var timeScale:TimeScale = new TimeScale(this);
                }
 
                public function tracer():void
                {
                        trace( "Main.tracer" );
 
                }
        }
 
}
import flash.display.Sprite;
 
class TimeScale extends Sprite
{
 
        public function TimeScale(main:Main)
        {
                graphics.beginFill(0xC0C0C0);
                graphics.drawRect(0, 0, 50, 50);
                main.addChild(this);
                main.tracer(); //Main.tracer
 
        }
}

в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)

Isfet 20.09.2012 12:31

Цитата:

Сообщение от silin (Сообщение 1096739)
в чем проблема у ТС не очень понятно
(ну не считая того, что так конечно не стоит делать)

ну суть в том, как обращаться к this.parent.perent.perent.parent as Main например, как доставать этот класc? Не хочется во всех детей передавать его.
Хранить статический метод, который вытаскивает ссылку на Main класс? Стоит ли Stage присваивать класс Main?
Как в таком случае оращаться к Main из детей(можно обращаться this.root as Main но не знаю правильно ли это)? Как я понял что когда Document class ставишь Main он становится статичным, и как тогда к нему обращаться из детей?

fish_r 20.09.2012 13:25

Цитата:

Сообщение от silin (Сообщение 1096739)
однако небольшой эксперимент показывает, что это не так

да, а я то иначе считал (http://www.flasher.ru/forum/showthre...=173074&page=3)


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

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