PDA

Просмотр полной версии : Вызов метода другого класса.


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