Как я могу вызвать метод в другом классе, используя слушателя 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();
}
Я могу придумать несколько других способов сделать это, но это определенно те четыре, которые вы должны рассмотреть. Моя личная рекомендация - использовать первое предложение