AS3:如何使鼠标位置检测正常工作?

时间:2011-09-21 23:25:32

标签: actionscript-3

我是AS3的新手,所以请提出我的基本问题。

我想要做的是在舞台左侧有一个左箭头MC,在舞台右侧有一个右箭头MC。当鼠标位于舞台的左1/3处时,左箭头出现,在舞台的右1/3处,出现右箭头,但中间1/3的箭头淡出。

我不想制作大型隐形MC并以这种方式检测鼠标移动。我只想让它相对于舞台上的鼠标位置。

我认为这很容易,但每次鼠标移动时都会触发eventListener,因此左右箭头MC动画会不断被触发,看起来他们因为缺少一个更好的单词而“颤抖”。

到目前为止我所拥有的是以下内容。有人可以帮我一点吗?

var stagePos:int = stage.width/3;

addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent) {
    var mouseArrow:int = mouseX;

    if (mouseArrow<stagePos) {
        arrowLeft_mc.gotoAndPlay("Show");
        trace ("left arrow show");
    } else if (mouseArrow>stagePos && mouseArrow<stagePos*2) {
        arrowLeft_mc.gotoAndPlay("Hide");
        arrowRight_mc.gotoAndPlay("Hide");
        trace ("nothing happens");
    } else if (mouseArrow>stagePos*2) {
        arrowRight_mc.gotoAndPlay("Show");
        trace ("right arrow show");
    }
}

2 个答案:

答案 0 :(得分:0)

if...else似乎没问题。唯一可能导致问题的是mc.gotoAndPlay。请尝试使用alpha属性:

var stagePos:int = stage.width/3;

addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent) {
    var mouseArrow:int = mouseX;

    if (mouseArrow<stagePos) {
        arrowLeft_mc.alpha = 1; //alpha is 1, arrow is shown
        trace ("left arrow show");
    } else if (mouseArrow>stagePos && mouseArrow<stagePos*2) {
        arrowLeft_mc.alpha = 0; //alpha is 0, arrow is hidden
        arrowRight_mc.alpha = 0;
        trace ("nothing happens");
    } else if (mouseArrow>stagePos*2) {
        arrowRight_mc.alpha = 1;
        trace ("right arrow show");
    }
}

答案 1 :(得分:0)

问题在于重复调用代码的速度。 如果您正在倾听MouseEvent.MOUSE_MOVE,那么任何'gotoAndPlay'业务都会以太快的速度完成。

由于您不想使用不可见的MovieClip(它为您提供非常方便的MouseEvent.ROLL_OVERMouseEvent.ROLL_OUT事件),因此您将继续轮询以评估代码中的坐标。< / p>

您需要记住代码提供的最后一个“答案”,然后忽略下次已经存在的情况。你必须忍受我对switch语句的偏好。

var stagePos:int = stage.width/3;
var _arrowShowing : int = 0;
addEventListener(MouseEvent.MOUSE_MOVE, arrowDetectHandler);
function arrowDetectHandler(e:MouseEvent)
{
    var mouseArrow:int = mouseX;

    switch( true )
    {
        case ( !_arrowShowing == 1 && mouseArrow < stagePos ) :
            _arrowShowing = 1;
            arrowLeft_mc.gotoAndPlay("Show");
            trace ("left arrow show");
            break;
        case ( !_arrowShowing == 0 && mouseArrow > stagePos && mouseArrow < stagePos * 2 ) :
            _arrowShowing = 0;
            arrowLeft_mc.gotoAndPlay("Hide");
            arrowRight_mc.gotoAndPlay("Hide");
            trace ("nothing happens");
            break;
        case ( !_arrowShowing == 2 && mouseArrow>stagePos*2 ) :
            _arrowShowing = 2;
            arrowRight_mc.gotoAndPlay("Show");
            trace ("right arrow show");
            break;
    }
}