是的,我在这里看到了一些关于类似问题的主题,但我的问题不同。我在FlashDevelopment中设置了一个AIR项目并编写了以下内容:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Main extends Sprite {
public function Main():void {
graphics.beginFill(0)
graphics.drawRect(0, 0, 100, 100)
graphics.endFill()
addEventListener(MouseEvent.CLICK, onEvt)
}
private function onEvt(e:MouseEvent):void {
trace("yahoo")
}
}
}
我编译了这个项目,点击了黑色方块,什么也没发生。什么都没有。然后我将所有这些代码移动到另一个类 RealMain 并将其添加为子类:
public function Main():void {
addChild(new RealMain())
}
它奏效了。那么,如果类是文档类,为什么我的事件侦听器不起作用?是的,我可以使用stage.addEventListener(),但为什么呢?
尝试不使用 Sprite 的图形属性,而是制作一个 Shape,在其上绘制并将其添加到您的 Sprite 中。我希望一个没有子角色的精灵表现为形状,而形状本身无法听事件。
public class Main extends Sprite {
public function Main():void {
var sh:Shape=new Shape();
sh.graphics.beginFill(0);
sh.graphics.drawRect(0, 0, 100, 100);
sh.graphics.endFill();
addChild(sh);
addEventListener(MouseEvent.CLICK, onEvt);
}
private function onEvt(e:MouseEvent):void {
trace("yahoo");
}
}
应该以这种方式工作。
addEventListener 是 EventDispatcher 类的函数,需要调用 EventDispatcher 的实例。
Main 的行为略有不同,因为它是以静态方式调用的。为了拥有一个 Main 实例,我们必须做一些如下工作(不是很优雅)
package {
import flash.display.Stage;
import flash.display.MovieClip;
public class Main extends MovieClip {
private static var _instance:Main = null;
public function Main() {
_instance = this;
}
public static function getInstance():Main { return _instance; }
public static function getStage():Stage { return getInstance().stage; }
}
}
Addchild有助于创建一个普通的类。
文档类必须扩展MovieClip
而不是Sprite