0

这是我的自定义事件类:

package{
 import flash.events.Event;

 public class PetEvent extends Event{
      public static const ON_CRASH:String = "onCrash";

      public function PetEvent(type:String, bubbles:Boolean=true, cancelable:Boolean=false):void{
           super(type, bubbles, cancelable);
      }

      override public function clone():Event {
           return new PetEvent(type, bubbles, cancelable);
      }
 }
}

这是我的游戏处理程序。我创建了一个我想从中收听的 Surf 类的新实例。

package {
import flash.display.MovieClip;
import flash.events.Event;

public class GameHandler extends MovieClip {
    public var newGame:Surf;

    public function GameHandler() {
        newGame = new Surf();
        newGame.addEventListener(PetEvent.ON_CRASH, onCrash);
        addChild(newGame);
    }

    public function onCrash(petEvent:PetEvent):void{
        trace("MPAM");
        var gameOver:GameOver = new GameOver(stage.stageWidth, stage.stageHeight);
        addChild(gameOver);

        newGame = null;
    }
}
}

以及来自 Surf 类的相关行:

public function startSurfing(timerEvent:TimerEvent):void
{
    moveCatandDog();
    for each ( var boat:Boat in armada)
    {
        boat.moveBoat(boatSpeed);
        if ( cat.hitTestObject(boat) || dog.hitTestObject(boat) )
        {
            dispatchEvent( new PetEvent(PetEvent.ON_CRASH) );
            gameTimer.stop();
        }
    }
}

因此,当 Surf 检测到崩溃时,我希望它将事件发送到 GameHandler 并且 GameHandler 将创建一个 GameOver 实例。

我已经尝试了一切,我什至没有得到任何痕迹。我通常不问问题,但这是针对 uni 项目的,我的时间不多了。我真的很感激任何反馈。谢谢!

4

1 回答 1

0

问题解决了!

我不得不将我的文档类更改为 GameHandler 并创建一个公共的舞台静态变量。

以前我将 Surf 作为我的文档类,因为我在舞台上设置了一些键盘监听器。

所以 PetEvent 和 Surf 中的调度是正确的。我更改了 GameHandler,如下所示,在 StackOverflow 中找到了另一个解决方案。

在 GameHandler 的构造函数中,如果舞台准备就绪(不为空),它会将其设置为公共静态变量 STAGE(通过 init 函数),否则它会添加一个侦听器,当舞台准备就绪时,它会执行相同的操作并删除听众。

package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.display.Stage;

public class GameHandler extends MovieClip {
    public var newGame:Surf;

    public static var STAGE:Stage;

    public function GameHandler() {
        if (stage){
            init();
        } else {
            addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
        }

        newGame = new Surf();
        newGame.addEventListener(PetEvent.ON_CRASH, onCrash);
        addChild(newGame);
    }

    private function init(e:Event=null):void{
        removeEventListener(Event.ADDED_TO_STAGE, init);
        // store stage reference when stage ready  
        STAGE=stage;
    }

    public function onCrash(petEvent:PetEvent):void{
        var gameOver:GameOver = new GameOver(stage.stageWidth, stage.stageHeight);
        addChild(gameOver);

        newGame = null;
    }
}
} 

我将 GameHandler 导入到 Surf 中:

import GameHandler;    

所以我可以将 Surf 中的侦听器设置为 GameHandler.STAGE.addEventListener (...)

谢谢大家的建议!

于 2013-02-26T18:07:41.520 回答