Форум Flasher.ru

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

n0uk 01.03.2008 01:22

Вызов метода другого класса.
 
Простите за тупой вопрос. До этого с AS/Flash не работал никогда но тут два дня назад пришлось.
Скачал Adobe Flash CS3 Trial, создал с горем пополам fla документ, забиндил на Document class , "main.test1" все работает.
Создал Symbol, привязал его к main.myButton, положил myButton.as в /main/, все работает. Создал еще один Symbol привязал его к main.myButton2.
И возникла проблема, надо по событию в myButton скрыть символ myButton2.
Если сделать метод ставящий visible = false в myButton2, его не видно из myButton. Если сделать его статическим, его видно, но к переменной visible внутри метода доступа нет. Как только не извращался методом тыка, читал документацию, но понять сакральный смысл этой проблемы не могу.
Как это можно сделать?.

DarkLight 01.03.2008 02:27

ну во-первых, экземпляр myButtton должен как-то получать ссылку на экземпляр myButton2, и затем уже у этого экземпляра нужно менять свойства/вызывать методы. Для примера, в Document Class подписываемся на нужный event myButton-а, и по нему вызываем нужное действие в myButton2.

P. S. Имена классов должны начинаться с большой буквы

n0uk 01.03.2008 02:54

>ну во-первых, экземпляр myButtton должен как-то получать ссылку на экземпляр myButton2, и затем уже у этого экземпляра нужно менять свойства/вызывать методы. Для примера, в Document Class подписываемся на нужный event myButton-а, и по нему вызываем нужное действие в myButton2.
>
>P. S. Имена классов должны начинаться с большой буквы
Они в пакете main, и допустим код
Код:

/main/myButton2.as
package main {
          public class myButton2 extends MovieClip {
                ....
                static public function hello() {
                      trace("Hello World!");
                }
          }
}
/main/myButton.as
package main {
          public class myButton extends MovieClip {
                ....
                public function myButton() {
                      main.myButton2.hello();
                }
          }
}

Выведет в аутпут приветствие к этому миру.
Однако проблема в том что

Код:

/main/myButton2.as
package main {
          public class myButton2 extends MovieClip {
                ....
                public function setVisible(vis_state:Boolean) {
                      visible=vis_state;
                }
                ....
                public function myButton2() {
                      setVisible(false); // Все отработает, и символ скроется
                }
          }
}

/main/myButton.as
package main {
          public class myButton extends MovieClip {
                ....
                public function myButton() {
                      main.myButton2.setVisible(true); // крикнет что метода setVisible у myButton2 нет. Однако там метод в паблике и это меня ужасно путает, т.к. я не понимаю чего-то by design.
                }
          }
}

Второй вариант:
Код:

/main/myButton2.as
package main {
          public class myButton2 extends MovieClip {
                ....
                static public function setVisible(vis_state:Boolean) {
                      visible=vis_state; // Скажет что перменная visible недоступна.
                }
          }
}

/main/myButton.as
package main {
          public class myButton extends MovieClip {
                ....
                public function myButton() {
                      main.myButton2.setVisible(true); // скажет что переменная visible внутри метода main.myButton2.setVisible() недоступна.
                }
          }
}

Извратился добавив в класс переменную static public vis_state:Boolean и таймер который следит за ее состоянием, заработало. Но это ужасный и нежелательный вариант естественно.

>P. S. Имена классов должны начинаться с большой буквы
0_o.

UPD:
Хм. Походу я очень затупил посчитав что main.myButton2 возвращает созданный в рантайме экземпляр класса.
UPD2:
Все, вспомнил что значит статик в сях, понял свою ошибку, спасибо).

etc 01.03.2008 10:54

n0uk, во AS нет ни одного класса, чье имя начинается c маленькой буквы. А ваши кастомные почему-то как раз такие. Почему?

n0uk 01.03.2008 11:42

потому что это привычка). А то что в АС это плохой тон, я не знал).

etc 01.03.2008 11:47

Это плохой тон также и в других ECMAScript-языках. В Java в т.ч.

Gaen 02.03.2008 00:49

В разах примерно так


Код:

package{

    import flash.display.MovieClip;
    import flash.display.SimpleButton;
    import flash.events.MouseEvent;

    //Document root class
    public class Main extends MovieClip{

        //Будем считать что автоматическое объявление отключено
        var btn1:SimpleButton;
        var btn2:SimpleButton;

        //constructor
        function Main(){
            this.btn1.addEventListener(MouseEvent.CLICK, this.btn1ClickHandler);
        }//constructor

        private function btn1ClickHandler(e:MouseEvent){
              this.btn2.visible=(!this.btn2.visible);
        }//btn1ClickHandler

    }//Main

}//package



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

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