Flash-AS3:通过DispatchEvent从另一个类(第2部分)调用类中的函数

时间:2009-11-18 22:21:12

标签: flash actionscript-3 events class dispatchevent

嘿,这个问题是对Joel Hooks对我的一个较旧问题的评论的回复(How to call a function in a Class from another Class?

我能够使用公共静态var修复我自己的问题来引用我的一个类,所以在另一个类中我只需要使用this关键字就可以调用它。

instance = this; // in Navigation Class
Navigation.instance.introPlayButtonClick(); // in Intro Class

现在看来我不是用 OOP 的最佳或纯粹主义方式做这件事(可以在这里看到辩论),所以我提出这个问题的第二个问题希望能够正确理解这一点的时间。

问题

我有2个类,简介和导航。在Intro类中创建了一个按钮,需要调用Navigation类中的函数。我还有一个CustomEvent类,我在其中设置自定义事件。下面是代码,我已经删除了与此问题相关的所有不必要的代码。

简介班

当调用单击功能时,它会调度Navigation类正在侦听的事件。


package src.display
{
import flash.events.*;
 import flash.display.*;

 // ☼ --- Imported Classes
 import src.events.CustomEvent;
 import src.model.Navigation;

 public class Intro extends Sprite 
 {
  private var playBtn:MovieClip;
  private var colorTransform:ColorTransform;

  // ☼ --- Constructor
  public function Intro():void 
  {
      this.addEventListener(Event.ADDED_TO_STAGE, init);
  }

  // ☼ --- Init
  public function init(event:Event):void 
  {
      draw();
      this.removeEventListener(Event.ADDED_TO_STAGE, init);
  }

  public function draw():void 
  {
      playBtn = new PlayThumb;
      playBtn.buttonMode = true;   
      playBtn.x = 552;   
      playBtn.y = 289;
      playBtn.alpha = 1;

      // ☼ --- add button 
      addChild(playBtn);

      // ☼ --- button listeners
      playBtn.addEventListener(MouseEvent.MOUSE_UP, clicked);
  }
  //-----------------------------------------------------
  // ☼ --- My Old Function
  /*private function clicked(e:MouseEvent):void 
  {
      Navigation.instance.introPlayButtonClick(); // Open tab1
  }*/
  //-----------------------------------------------------
  // ♦♦♦ Added to dispatch Event to JStriedl's function ♦♦♦
  private function clicked(e:MouseEvent):void 
      {
      dispatchEvent (new CustomEvent(CustomEvent.INTRO_CLICKED, {}));
      trace("Dispatch Event INTRO_CLICKED");
      }
 }
}

导航类

这是导航类,其中包含Intro Class需要能够调用的函数。


package src.model 
{
import flash.events.*;
import flash.display.*;

// ☼ ---Imported  Classes
import src.display.Intro;
import src.model.Fonts;
import src.events.CustomEvent;

public class Navigation extends MovieClip //Needs MovieClip
{  
    public var intro:Intro;
    public static var instance:Navigation;

    // ☼ --- Constructor
public function Navigation()
{
    this.addEventListener(Event.ADDED_TO_STAGE, init);
}

// ☼ --- Init
public function init():void
{
    instance = this;  
    intro = new Intro;
    attachListenerForIntro(intro);
    this.removeEventListener(Event.ADDED_TO_STAGE, init);
}

// ♦♦♦ JStriedl's code ♦♦♦
public function attachListenerForIntro(introToCheckForClick:Intro)
{
    intro = introToCheckForClick;
    intro.addEventListener("introClicked", introPlayButtonClick);
}

// Function that button in Intro needs to call
public function introPlayButtonClick(e:CustomEvent):void
{    
    trace("Navigation function called from Intro");
    intro.removeEventListener("introClicked", introPlayButtonClick);
}
}
}

问题或错误

到目前为止,单击按钮时没有任何反应:(我假设我没有在导航类中正确设置EventListener?

2 个答案:

答案 0 :(得分:4)

通常,容器的责任是调用其子函数。

如果你想让(或其他独立的)兄弟姐妹互相交流,你的容器就会充当两者之间的代理人。

例如,如果您的应用程序结构如下:

container
  |
  +-- introInstance
  |
  +-- navigationInstance
  1. containerCustomEvent.INTRO_CLICKED上的introInstance事件添加了一个监听器。

  2. introInstance举起CustomEvent.INTRO_CLICKED事件。

  3. container的事件处理程序中调用navigationInstance.introPlayButtonClick()

  4. 通过这种方式,您的Intro课程不需要知道有关您的Navigation课程的任何内容,反之亦然,您的container会形成两个实例之间的粘合剂。“ p>

    快速注意:container不必是文字DisplayObjectContainer,其显示列表中包含两个项目,只需要引用两个实例并知道如何处理它们。

答案 1 :(得分:1)

Errr ..我能想到的唯一方法就是将你的Intro类扩展到Navigation类,以使其正常工作。

像...这样的东西。

public class Intro extends Navigation {}