Как я могу вызвать метод в другом классе, используя слушателя as3 addevent?

У меня два класса

Основной класс - класс Game

Public Class Game
{

    private var m_navButtons:NavButtons;

    public function Game( )
    {
         setUpLevelSelect();


    }

    public function setUpLevelSelect():void
    {
        addChild(levelsMovieClip);
        // when i click a level it plays the game

    }
    public function playGame():void
    {
       // plays game and add navButtons
       m_navButtons = new NavButtons( this.stage );

    }

}

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

public class NavButtons extends MovieClip
{
  public function NavButtons( stage:Stage )
  {
      // addNavigation to stage
      m_stage = stage;

      m_stage.addChild( icon );

      // addeventlisteners
      icon.backButton.addEventListener( MouseEvent.CLICK, goBackToLevelSelect );

  }

  public function goBackToLevelSelect( event:MouseEvent ):void
  {

// now i would like to call Game.setUpLevelSelect();


// but when i click the icon.backButton it says Cannot access a property or method of a null reference 
  }

}

в верхней части кнопок NavButton я положил public var game:Game;

У меня такое чувство, потому что я собираюсь вернуться к своему основному документу класса "Игра", но я не знаю, как его обойти.

1 ответ

Решение

Есть несколько способов сделать это.

Первый способ - отправить событие. Это правильный способ общения ребенка с родителем.

в игре:

navButtons.addEventListener( "customEventTypeHere", this.setUpLevelSelect ); 

в навигационных кнопках:

public function goBackToLevelSelect( event:MouseEvent ):void
{
    this.dispatchEvent( new Event( "customEventTypeHere" ) );
}

Вы также можете прикрепить слушателя MouseEvent непосредственно к кнопке из Game, а не из NavButton. Вам нужно будет сделать backButton публично, очевидно. Это технически правильно, но это устраняет уровень абстракции, так как родитель теперь полагается на этот объект backButton, находящийся в классе

В игре:

navButtons.backButton.addEventListener( MouseEvent.CLICK, this.setUpLevelSelect );

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

public var backButtonCallback:Function;
public function NavButton( stage:Stage, backButtonCallback:Function ) {
    this.backButtonCallback = backButtonCallback;
}

public function goBackToLevelSelect( event:MouseEvent ):void
{
    this.backButtonCallback();
}

Последний способ - это способ, который, честно говоря, не должен использоваться здесь или вообще во многих местах. Но это вариант, даже если он идет вразрез с основными принципами ООП. По сути, вы превращаете Game в частичный синглтон, сохраняя его экземпляр в статическом свойстве и через него получаете доступ к своей публичной функции. Это не рекомендуется, если у вас нет особых причин для этого, и вы можете работать только при наличии только одного экземпляра Game.

В игре:

public static var instance:Game;

public function Game() {
    instance = this;
}

В навигационных кнопках:

public function goBackToLevelSelect( event:MouseEvent ):void
{
    Game.instance.setUpLevelSelect();
}

Я могу придумать несколько других способов сделать это, но это определенно те четыре, которые вы должны рассмотреть. Моя личная рекомендация - использовать первое предложение

Другие вопросы по тегам