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

silin 20.09.2012 16:59

Цитата:

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

root и есть ссылка на экземпляр документ класса флешки, так и обращаться
нет в AS статичных классов, как нет никаких хитрых чудес при определении документ класса (по сути он всегда есть, только когда он явно не определен IDE\компилятор генерят его сами)

Цитата:

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

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

package
{
        import flash.display.DisplayObject;
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
                public var timeScale:TimeScale;
 
                public function Main():void
                {
                        timeScale = new TimeScale(this);
                }
 
                public function tracer():void
                {
                        trace( "Main.tracer" );
 
                }
        }
}
import flash.display.Sprite;
 
class TimeScale extends Sprite
{
 
        public function TimeScale(main:Main)
        {
                // на этот момент main.timeScale еще не определена
                // все происходит  до присваивания timeScale ссылки на экземпляр
                trace( "main.timeScale : " + main.timeScale );// main.timeScale : null
                // но сам-то main в порядке
                trace( "main : " + main );// main : [object Main]
                // и методы его тоже
                main.tracer();// Main.tracer
 
        }
}


Isfet 21.09.2012 05:38

Цитата:

Сообщение от silin (Сообщение 1096815)
нет в AS статичных классов, как нет никаких хитрых чудес при определении документ класса

Тогда почему когда я класс документа делаю Main у меня дети не видят публичные функции Main (точнее видят ,но не вызывают), видят только статичные.? Пример в 5 посте.

fish_r 21.09.2012 09:03

Цитата:

Сообщение от silin (Сообщение 1096815)
в лом перечитывать все, но в той ветке немного о другом вроде бы
вот смотри...

ага, я понял, что тогда сделал неправильные выводы.

Добавлено через 6 минут
Цитата:

Сообщение от Isfet (Сообщение 1096920)
Тогда почему когда я класс документа делаю Main у меня дети не видят публичные функции Main (точнее видят ,но не вызывают), видят только статичные.? Пример в 5 посте.

Посмотрите внимательно на код. Вы создаете не экземпляр Ojb1, а просто новый спрайт, который никак не связан с obj2, значит Ojb2 у вас вообще не инициализируется и вызов метода из майн не происходит.

Код AS3:

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

Добавлено через 21 минуту
а здесь в Main лишняя закрывающая скобка, вначале. Этот пример вообще должен выбрасывать ошибку.

Isfet 21.09.2012 10:15

5 пост писал в качестве примера "на коленке", ошибся немного , извиняюсь, исправил, суть в том что document class = Main, он добавляет в себя obj1, а obj1 добавляет в себя obj2, а затем я из obj2 обращаюсь к Main через root и у меня не вызываются публичные методы Main, ошибка, как будто они приватные.

silin 21.09.2012 17:11

пример, использующий недоступные классы, нельзя запустить и увидеть в чем трабл

вот попытка реконструировать твою структуру, но она почему-то работает
попробуй поломать, чтоб перестала, может тогда разберемся
Код AS3:

package classes
{
        import classes.timeScale.TimeScale;
        import flash.display.Sprite;
 
        public class Main extends Sprite
        {
                public function Main()
                {
                        drawTimeScale();
                }
 
                private function drawTimeScale():void
                {
                        var timeScale:TimeScale = new TimeScale();
                        addChild(timeScale);
                }
 
                public function getVarFromDateScale():void
                {
                        trace( "Main.getVarFromDateScale" );
 
                }
        }
}

Код AS3:

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

Код AS3:

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

Код AS3:

package classes.timeScale
{
        import classes.Main;
        import flash.display.Sprite;
        import flash.events.MouseEvent;
 
        public class Obj2 extends Sprite
        {
                public function Obj2()
                {
                        this.addEventListener(MouseEvent.CLICK, onMClick);
                        this.graphics.beginFill(0xFF0000);
                        this.graphics.drawRect(0, 0, 60, 60);
                }
 
                public function onMClick(e:MouseEvent):void
                {
 
                        (this.root as Main).getVarFromDateScale(); // Main.getVarFromDateScale
                }
        }
}


Isfet 22.09.2012 09:04

странно, у меня тоже работает. а когда документу присваиваешь класс нужно еще какие-то настройки выставлять во flash cs5 или просто тупо в свойтвах документа присваеваешь ему класс и все должно работать? а то заметил такую закономерность: качаю исходник чужой, сохраняю его в другую папку, копирую туда свой код - не работает, прям в исходник вставляю свой код - работает.

fish_r 22.09.2012 11:51

а вы пакет указываете в строке для документ-класса? Это обязательно иначе ИДЕ документ-класс не найдет и создаст свой.

Isfet 23.09.2012 06:54

ну да прописываю там classes.Main


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

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