0

我有两节课

一个主要的类 - 类游戏

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 
  }

}

在我放的 NavButtons 的顶部public var game:Game;

我有一种感觉,因为我想回到我的主文档类“游戏”,但我不确定如何绕过它。

4

1 回答 1

1

有几种方法可以做到这一点。

第一种方法是发送事件。这是孩子与父母沟通的正确方式。

在游戏中:

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

在导航按钮中:

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

您还可以将 MouseEvent 侦听器直接附加到 Game 中的按钮,而不是 NavButtons。显然,你需要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();
}

老实说,最后一种方式是不应该在这里或在许多地方使用的方式。但这是一种选择,即使它确实违背了基本的 OOP 原则。基本上,通过将 Game 的实例存储在静态属性中并通过那里访问您的公共函数,您可以将 Game 变成部分 Singleton。除非您有特定原因,否则不建议这样做,并且只有在只有一个 Game 实例时才能使用。

在游戏中:

public static var instance:Game;

public function Game() {
    instance = this;
}

在导航按钮中:

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

我可以想到其他一些方法来做到这一点,但这些肯定是你应该考虑的四种。我个人的建议是使用第一个建议

于 2013-05-20T18:24:50.580 回答