as3 startDrag时如何让物件后的物件鼠标事件生效

我为spriteA添加了鼠标按下、弹起事件监听,spriteB添加了鼠标移入、移出事件监听,对spriteA按下时,startDrag(),当拖到spriteB上时,由spriteB的监听给出spriteB的坐标,然后将spriteA stopDrag(),把spriteA的坐标设为spriteB的坐标于之重合。
这里碰到的问题是as3无法让spriteA在spriteB上时,同时让spriteB的监听生效,我采用mouseEnabled = false的办法,又会让spriteA的MOUSE_UP失效,无法达到stopDrag(),不知道有没有更好的办法解决呢?万分感谢
以下是部分代码
classA:
for(){
cardPic[i] = new Sprite();
cardPic[i].addEventListener(MouseEvent.MOUSE_DOWN,dragCard);
cardPic[i].addEventListener(MouseEvent.MOUSE_UP,dragStopCard);
}
public function dragCard(event:MouseEvent):void
{
dragPro = {pX:Sprite(event.target).x,pY:Sprite(event.target).y,pR:Sprite(event.target).rotation}
Sprite(event.target).startDrag();
Sprite(event.target).mouseEnabled = false;
}
public function dragStopCard(event:MouseEvent):void
{
Sprite(event.target).stopDrag();
if (Box.stopDragPro == null)
{
Sprite(event.target).x = dragPro.pX;
Sprite(event.target).y = dragPro.pY;
Sprite(event.target).rotation = dragPro.pR;
}else
{
Sprite(event.target).x = Box.stopDragPro.pX;
Sprite(event.target).y = Box.stopDragPro.pY;
Sprite(event.target).rotation = Box.stopDragPro.pR;
}
}

classB:
boxFrame.addEventListener(MouseEvent.MOUSE_OVER,thisFrameOver);
boxFrame.addEventListener(MouseEvent.MOUSE_OUT,thisFrameOut);
public function thisFrameOver(event:MouseEvent):void
{
var glow:GlowFilter = new GlowFilter();
Box.stopDragPro = {pX:Sprite(event.target).x,pY:Sprite(event.target).y,pR:Sprite(event.target).rotation};
glow.blurX = 5;
glow.blurY = 5;
glow.alpha = 0.8;
Sprite(event.target).filters = [glow];
}
public function thisFrameOut(event:MouseEvent):void
{
Box.stopDragPro = null;
Sprite(event.target).filters = [];
}

你好。看你的意思是要拖动A然后如果拖到B上就让A与B重合,那么你的B侦听器就没必要用了啊,在哪里都可以读取到B的坐标的,不一定要在他的侦听器里。这种形式,帮你写了一个代码:
import flash.display.Sprite;
import flash.events.MouseEvent;
var s1:Sprite=new Sprite();
s1.graphics.beginFill(0x4444ff);
s1.graphics.drawRect(0,0,200,150);
s1.graphics.endFill();
var s2:Sprite=new Sprite();
s2.graphics.beginFill(0,0.3);
s2.graphics.drawRect(0,0,200,150);
s1.x=50;
s1.y=20;
s2.x=300;
s2.y=200;
addChild(s2);
addChild(s1);
s1.addEventListener(MouseEvent.MOUSE_DOWN,hdrag);
function hdrag(e:MouseEvent){
s1.startDrag();
s1.removeEventListener(MouseEvent.MOUSE_DOWN,hdrag);
s1.addEventListener(MouseEvent.MOUSE_MOVE,hupdate);
s1.addEventListener(MouseEvent.MOUSE_UP,hstop);
}
function hupdate(e:MouseEvent){
e.updateAfterEvent();
}
function hstop(e:MouseEvent){
s1.stopDrag();
s1.removeEventListener(MouseEvent.MOUSE_MOVE,hupdate);
s1.removeEventListener(MouseEvent.MOUSE_UP,hstop);
s1.addEventListener(MouseEvent.MOUSE_DOWN,hdrag);
if(s2.hitTestPoint(mouseX,mouseY)){
s1.x=s2.x;
s1.y=s2.y;
}
}
直接复制到帧上就可以运行。追问

是这样的,我的SpriteA是由for循环生成的其中一个,而SpriteB也是另外一个for循环生成的,在这种情况下要直接读取x和y的话是没有准确的Sprite对象的,而且SpriteB也可能是循环生成10个SpriteB中的任意一个,难以准确知道

追答

那就这样。
你每次startDrag的时候,建立一个变量储存正在拖动的对象,然后当鼠标释放的时候,读取此变量的dragTarget属性,然后在B的数组里面查找,如果存在即命中。
给你个例子:
import flash.display.Sprite;
import flash.events.MouseEvent;
var As:Array=[];
var Bs:Array=[];
for(var i=0;i<10;i++){
var s:Sprite=new Sprite();
s.graphics.beginFill(0,0.5);
s.graphics.drawRect(0,0,40,30);
s.graphics.endFill();
s.x=i*50;
s.y=240;
addChild(s);
Bs.push(s);
}
for(i=0;i<10;i++){
s=new Sprite();
s.graphics.beginFill(0x4444ff);
s.graphics.drawRect(0,0,40,30);
s.graphics.endFill();
s.x=i*50;
s.y=40;
s.addEventListener(MouseEvent.MOUSE_DOWN,hdrag);
addChild(s);
As.push(s);
}
function hdrag(e:MouseEvent) {
e.target.startDrag();
e.target.removeEventListener(MouseEvent.MOUSE_DOWN,hdrag);
e.target.addEventListener(MouseEvent.MOUSE_MOVE,hupdate);
e.target.addEventListener(MouseEvent.MOUSE_UP,hstop);
}
function hupdate(e:MouseEvent) {
e.updateAfterEvent();
}
function hstop(e:MouseEvent) {
e.target.stopDrag();
e.target.removeEventListener(MouseEvent.MOUSE_MOVE,hupdate);
e.target.removeEventListener(MouseEvent.MOUSE_UP,hstop);
e.target.addEventListener(MouseEvent.MOUSE_DOWN,hdrag);
if(e.target.dropTarget&&Bs.indexOf(e.target.dropTarget)!=-1) {
e.target.x=e.target.dropTarget.x;
e.target.y=e.target.dropTarget.y;
}
}

温馨提示:内容为网友见解,仅供参考
无其他回答

as3 startDrag时如何让物件后的物件鼠标事件生效
你好。看你的意思是要拖动A然后如果拖到B上就让A与B重合,那么你的B侦听器就没必要用了啊,在哪里都可以读取到B的坐标的,不一定要在他的侦听器里。这种形式,帮你写了一个代码:import flash.display.Sprite;import flash.events.MouseEvent;var s1:Sprite=new Sprite();s1.graphics.beginFill(0x...

一个有关as3.0中startDrag()和stopDrag()的问题
应该是你注册点设置的位置在图形外面了 这样startDrag()后 鼠标就跑到图形外面 当你stopDrag的时候 图形接收不到鼠标释放的动作 所以没有起作用.建议解决方案是 侦听器不要加在mc上 直接加到时间轴上 即 this.addEventListener

再加50分奖励。Flash动作命令中英文对照,或者每条命令的作用!
- startDrag 开始拖动 - stop 停止 - stopAllSounds 停止所有声音的播放 - stopDrag 停止拖动 - swapDepths 交换两个MC的深度 - tellTarget 指定Action命令生效的目标 - toggleHighQuality 在高画质和低画质间切换 - trace 跟踪调试 - unloadMovie 卸载MC - var 声明局部变量 - while 当..成立时.. - with ...

相似回答
大家正在搜