AS3: доступ к открытым функциям пользовательских классов из мувиклипа на временной шкале - PullRequest
2 голосов
/ 19 ноября 2009

У меня есть программа AS3 с пользовательским классом Main.as.

В этом классе я загружаю экземпляр мувиклипа 'menu', в котором есть экземпляры simpleButton ... Как получить доступ к открытым функциям основного класса с помощью кнопок мувиклипа меню?

т.е. Кнопка меню -> gotoPage (5); (что является основной публичной функцией)

Если я пытаюсь получить доступ к функции Main с помощью приведенного выше оператора, это дает

"1180: вызов возможно неопределенного метода gotoPage.

Ответы [ 3 ]

4 голосов
/ 19 ноября 2009

Создайте статический метод GetMain () в классе Main, который будет возвращать экземпляр Main (Main должен быть одноэлементным).

package whatever
{
  public class Main
  {
    private static var _instance:Main = null;

    public static function getMain():Main
    {
      return _instance;
    }

    // Main constructor
    function Main(..):void
    {
      _instance = this;
    }
  }
}

Чтобы сослаться на экземпляр Main () из вашего класса Menu, вы можете использовать:

Main.getMain().gotoPage(5);
1 голос
/ 02 декабря 2009

Ответ ruedaminute о передаче событий с кнопок и о том, что эти события выполняются в основном процессе, безусловно, лучший способ справиться с этим, но в as3 есть много способов сделать это, но попробуйте использовать вышеупомянутую технику. Некоторые из других методов.

  • Создание функции в Main, такой как открытая функция GotoPage (iPageNum: int): void {}

от кнопки - попробуйте this._parent.GotoPage (1);

но this._parent может быть не основным, выполнить трассировку (this._parent) и продолжать попытки это может оказаться this._parent._parent._parent.GotoPage (1) в зависимости от иерархии дерева отображения.

Опять же, это ДЕЙСТВИТЕЛЬНО плохие ООП-практики, но хорошо, это сработает.

Еще один метод - использовать синглтон для основных, похоже, что вы уже есть - добавить тот же публичный метод, затем, нажав кнопку, вы можете сделать Main.getMain (). GotoPage (1);

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

Удачи! ~ JT

1 голос
/ 22 ноября 2009

Вы хотите сделать это с событиями. Если ваш мувиклип меню является дочерним по отношению к Main.as, как вы сказали, назовите кнопки экземпляра внутри мувиклипа меню и настройте слушателей в Main.as:

.

1) Поместите приведенный ниже код в конструктор: public function Main(){...

menu.button_a.addEventListener(MouseEvent.CLICK, onButtonClick);
menu.button_b.addEventListener(MouseEvent.CLICK, onButtonClick);

2) и затем напишите функцию onButtonClick в Main.as

private function onButtonClick(e:MouseEvent):void{
   switch(e.currentTarget.name){
       case "button_a":
          //call the Main.as function you want here
          break;
       case "button_b":
          //call a different Main.as function
          break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...