Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 使用AS3在Flash中进行鼠标滚动/滚动检测的首选方法是什么_Actionscript 3_Mouse_Rollover_Hittest_Rollout - Fatal编程技术网

Actionscript 3 使用AS3在Flash中进行鼠标滚动/滚动检测的首选方法是什么

Actionscript 3 使用AS3在Flash中进行鼠标滚动/滚动检测的首选方法是什么,actionscript-3,mouse,rollover,hittest,rollout,Actionscript 3,Mouse,Rollover,Hittest,Rollout,假设我们有一个有两个正方形的舞台,如下所示: 假设我们希望最初隐藏黄色方块,只要鼠标光标在红色方块的边界内,黄色方块就会可见,只要鼠标光标在红色方块的边界外,黄色方块就会被隐藏 直观的方法是这样写: inSqr.visible = false; outSqr.addEventListener (MouseEvent.ROLL_OVER,sqrOver); outSqr.addEventListener (MouseEvent.ROLL_OUT,sqrOut); function sqrOve

假设我们有一个有两个正方形的舞台,如下所示:

假设我们希望最初隐藏黄色方块,只要鼠标光标在红色方块的边界内,黄色方块就会可见,只要鼠标光标在红色方块的边界外,黄色方块就会被隐藏

直观的方法是这样写:

inSqr.visible = false;
outSqr.addEventListener (MouseEvent.ROLL_OVER,sqrOver);
outSqr.addEventListener (MouseEvent.ROLL_OUT,sqrOut);

function sqrOver(e:MouseEvent) {
    inSqr.visible = true;
}

function sqrOut (e:MouseEvent) {
    inSqr.visible = false;
}
但是,使用此代码-无论何时将鼠标光标移动到黄色方框内- 显然,对于红色方块,它算作滚动 因此,sqrOut函数被触发-使黄色方块消失,一旦黄色方块不在那里-光标突然再次位于红色方块的边界内-因此sqrOver函数 被调用-恢复黄色方块的可见性-触发sqrOut等,从而在鼠标光标位于其上方时创建一个“闪烁”的黄色方块: 黄色的方块消失了,一次又一次地重复出现

一个可能的“修复”方法是,当光标位于黄色内时,删除红色滚动事件的侦听器(如果光标位于黄色内,则肯定也位于红色内),并在其退出时将其带回来,方法是将以下内容添加到上面的代码中:

 inSqr.addEventListener (MouseEvent.ROLL_OVER,insqrOver);
 inSqr.addEventListener (MouseEvent.ROLL_OUT,insqrOut);
 function insqrOver(e:MouseEvent) {
     if (outSqr.hasEventListener (MouseEvent.ROLL_OUT)) {
         outSqr.removeEventListener(MouseEvent.ROLL_OUT,sqrOut);
     }
     inSqr.visible = true;
 }
 function insqrOut(e:MouseEvent) {
     if (!outSqr.hasEventListener (MouseEvent.ROLL_OUT)) {
         outSqr.addEventListener(MouseEvent.ROLL_OUT,sqrOut);
     }
 }
这很有效。 但这很麻烦。您必须对红方块边界内的每个对象执行此操作-导致长代码和许多事件侦听器以及连续的侦听器注册和注销


几年前,有人向我建议了这种技巧:

 outSqr.addEventListener (Event.ENTER_FRAME,hoverCheck);

 function hoverCheck (e:Event) {
     if (e.currentTarget.hitTestPoint(stage.mouseX,stage.mouseY,true)) {
         inSqr.visible = true;
     }
     else {
         inSqr.visible = false;
     }
 }
这是一个简单的短代码。 但是,如果您的项目实际上不需要使用ENTER_FRAME事件,那么重复运行命中测试会产生不必要的开销和cpu周期。 此外,如果红场覆盖整个舞台(与舞台尺寸相同)—— 它会产生问题(它不工作



有人知道一种简单而优雅的方法来实现这一点吗?这种方法不需要太麻烦和太长的代码,也不需要使用反复运行测试的计时器……?

将黄色方框放在红色方框内

outSqr.addChild(inSqr);

这将很好地简单地解决您的问题。只需确保outSqr是
Sprite
MovieClip
类的实例。

将黄色方块放在红色方块内

outSqr.addChild(inSqr);
这将很好地简单地解决您的问题。只需确保outSqr是
Sprite
MovieClip
类的一个实例。

包{
导入flash.events.MouseEvent;
导入flash.display.Sprite;
公共类FlashTest扩展了Sprite{
私家车:雪碧;
私家车:雪碧;
公共功能测试(){
外部=giveRect(2002000xFF0000);
addChild(外部);
内部=giveRect(50,50,0xffff00);
addChild(内部);
内部x=内部y=75;
stage.addEventListener(MouseEvent.MOUSE\u MOVE,onMove);
}
私有函数giveRect(w:int,h:int,color:int):Sprite{
var spr:Sprite=新Sprite();
spr.graphics.Beginll(彩色);
spr.graphics.drawRect(0,0,w,h);
spr.graphics.endFill();
返回spr;
}
onMove的私有函数(e:MouseEvent):void{
内部.visible=stage.mouseX>outer.x&&
stage.mouseXouter.y&&
stage.mouseY

包{
导入flash.events.MouseEvent;
导入flash.display.Sprite;
公共类FlashTest扩展了Sprite{
私家车:雪碧;
私家车:雪碧;
公共功能测试(){
外部=giveRect(2002000xFF0000);
addChild(外部);
内部=giveRect(50,50,0xffff00);
addChild(内部);
内部x=内部y=75;
stage.addEventListener(MouseEvent.MOUSE\u MOVE,onMove);
}
私有函数giveRect(w:int,h:int,color:int):Sprite{
var spr:Sprite=新Sprite();
spr.graphics.Beginll(彩色);
spr.graphics.drawRect(0,0,w,h);
spr.graphics.endFill();
返回spr;
}
onMove的私有函数(e:MouseEvent):void{
内部.visible=stage.mouseX>outer.x&&
stage.mouseXouter.y&&
stage.mouseY
我不知道这对您的情况是否有帮助,但您也可以禁用inSqr的鼠标操作,然后您可以将鼠标悬停在不会触发滚动的黄色方块上

inSqr.mouseEnabled = false
…那么你可以用这个:

inSqr.visible = false;
outSqr.addEventListener (MouseEvent.ROLL_OVER,sqrOver);
outSqr.addEventListener (MouseEvent.ROLL_OUT,sqrOut);

function sqrOver(e:MouseEvent) {
    inSqr.visible = true;
}

function sqrOut (e:MouseEvent) {
    inSqr.visible = false;
}

我不知道这对你的情况是否有帮助,但你也可以禁用inSqr的鼠标操作,然后你可以将鼠标悬停在黄色方块上,这不会触发滚动

inSqr.mouseEnabled = false
…那么你可以用这个:

inSqr.visible = false;
outSqr.addEventListener (MouseEvent.ROLL_OVER,sqrOver);
outSqr.addEventListener (MouseEvent.ROLL_OUT,sqrOut);

function sqrOver(e:MouseEvent) {
    inSqr.visible = true;
}

function sqrOut (e:MouseEvent) {
    inSqr.visible = false;
}

最后使用了这种方法,尽管它需要大量的代码重新排列和重写…最后使用了这种方法,尽管它需要大量的代码重新排列和重写。。。