incvizitor
18.08.2010, 15:13
Есть javascript код, который на правый клик вызывает через коллбэк нейкую функцию RightClick. AS3 смотрит все объекты что находяться под мышкой, самый верхний распростораняет событие RightMouseEvent. На объекты просто вешаеться листенер. Только вот проблемка что событие не распростаняеться, хотя по тестам видно что запрос на распространение происходит... что не так?
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import vaukalak.utils.RightMouseEvent;
/**
* ...
* @author vaukalak
*/
public class Main extends MovieClip
{
public function Main() {
RightMouseEvent.enable(stage);
obj1.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj2.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj3.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj4.addEventListener(RightMouseEvent.CLICK, _onRightClick);
//(obj1 as DisplayObject).dispatchEvent(new RightMouseEvent(RightMouseEvent.CLICK));
//если прописать тут распротраняеться.
}
private function _onRightClick(e:Event):void {
(e.target as DisplayObject).x += 100;
}
}
}
package vaukalak.utils
{
import flash.display.DisplayObject;
import flash.display.InteractiveObject;
import flash.display.Stage;
import flash.events.Event;
import flash.external.ExternalInterface;
import flash.geom.Point;
/**
* ...
* @author vaukalak
*/
public class RightMouseEvent extends Event
{
public static const CLICK:String = "Right Click";
private static var _stage:Stage;
//переопределения класса Event
public function RightMouseEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public override function clone():Event
{
return new RightMouseEvent(type, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("RightMouseEvent", "type", "bubbles", "cancelable", "eventPhase");
}
//в метод enable нужно передать объект stage
public static function enable(stage:Stage):void {
_stage = stage;
ExternalInterface.addCallback("rightClick", _onRightClick);
}
//метод _onRightClick отыскивает непосредственно верхний объект под мышой, и приказывает объекту распространить событие
private static function _onRightClick():void {
var objs:Array = _stage.getObjectsUnderPoint(new Point(_stage.mouseX, _stage.mouseY));
(objs[objs.length-1] as DisplayObject).dispatchEvent(new RightMouseEvent(RightMouseEvent.CLICK));
}
}
}
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import vaukalak.utils.RightMouseEvent;
/**
* ...
* @author vaukalak
*/
public class Main extends MovieClip
{
public function Main() {
RightMouseEvent.enable(stage);
obj1.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj2.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj3.addEventListener(RightMouseEvent.CLICK, _onRightClick);
obj4.addEventListener(RightMouseEvent.CLICK, _onRightClick);
//(obj1 as DisplayObject).dispatchEvent(new RightMouseEvent(RightMouseEvent.CLICK));
//если прописать тут распротраняеться.
}
private function _onRightClick(e:Event):void {
(e.target as DisplayObject).x += 100;
}
}
}
package vaukalak.utils
{
import flash.display.DisplayObject;
import flash.display.InteractiveObject;
import flash.display.Stage;
import flash.events.Event;
import flash.external.ExternalInterface;
import flash.geom.Point;
/**
* ...
* @author vaukalak
*/
public class RightMouseEvent extends Event
{
public static const CLICK:String = "Right Click";
private static var _stage:Stage;
//переопределения класса Event
public function RightMouseEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
}
public override function clone():Event
{
return new RightMouseEvent(type, bubbles, cancelable);
}
public override function toString():String
{
return formatToString("RightMouseEvent", "type", "bubbles", "cancelable", "eventPhase");
}
//в метод enable нужно передать объект stage
public static function enable(stage:Stage):void {
_stage = stage;
ExternalInterface.addCallback("rightClick", _onRightClick);
}
//метод _onRightClick отыскивает непосредственно верхний объект под мышой, и приказывает объекту распространить событие
private static function _onRightClick():void {
var objs:Array = _stage.getObjectsUnderPoint(new Point(_stage.mouseX, _stage.mouseY));
(objs[objs.length-1] as DisplayObject).dispatchEvent(new RightMouseEvent(RightMouseEvent.CLICK));
}
}
}