MouseEvent在文档类中不起作用

时间:2012-12-05 15:40:35

标签: actionscript-3 flash air

是的,我在这里看到了一些关于类似问题的话题,但我的问题不同了。我在FlashDevelop中设置了一个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())
}

它有效。那么,为什么我的eventlistener不工作如果类是文档类?是的,我可以使用stage.addEventListener(),但为什么?

3 个答案:

答案 0 :(得分:1)

尝试不使用Sprite的图形属性,但创建一个Shape,在其上绘制并将addChild()添加到Sprite中。我希望一个零孩子的Sprite表现为一个Shape,而形状本身就不能听事件。

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");
    }
}

应该这样工作。

答案 1 :(得分:1)

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有助于创建一个通常的类。

答案 2 :(得分:-1)

文档类必须扩展MovieClip而不是Sprite