当鼠标离开Clip1但鼠标在剪辑2中时,不会触发动画代码

时间:2015-08-20 04:12:09

标签: actionscript-3 actionscript

问题:

当我将鼠标光标移出剪辑1但是在剪辑2上方时,剪辑1的MOUSE_OUT不起作用。

期望:

假设鼠标位于Clip 2内部,鼠标的位置已经在Clip 1之外,因此Clip 1的function mouse_out()应该触发其中的代码。

完整代码:

到目前为止,我附上了完整的代码。

import flash.display.MovieClip;

cat1.addEventListener(MouseEvent.MOUSE_OVER,mouse_over);
cat1.addEventListener(MouseEvent.MOUSE_OUT,mouse_out);
cat2.addEventListener(MouseEvent.MOUSE_OVER,mouse_over);
cat2.addEventListener(MouseEvent.MOUSE_OUT,mouse_out);
cat3.addEventListener(MouseEvent.MOUSE_OVER,mouse_over);
cat3.addEventListener(MouseEvent.MOUSE_OUT,mouse_out);
cat4.addEventListener(MouseEvent.MOUSE_OVER,mouse_over);
cat4.addEventListener(MouseEvent.MOUSE_OUT,mouse_out);
cat5.addEventListener(MouseEvent.MOUSE_OVER,mouse_over);
cat5.addEventListener(MouseEvent.MOUSE_OUT,mouse_out);

function mouse_over(e:MouseEvent)
{
    squareEaseOut(e.currentTarget,["scaleX",1.5,"scaleY",1.5]);
}

function mouse_out(e:MouseEvent)
{
    squareEaseOut(e.currentTarget,["scaleX",1,"scaleY",1]);
}

var iSquareEasingInterval:int;

//simple square easing, this can capture several properties to be animated
function squareEaseOut(mc:Object,vars:Array)
{
    var checker:int = 0;
    clearInterval(iSquareEasingInterval);

    var ini:Array = new Array();
    var accelNum:Number = 0;
    var jerkNum:Number = 0;
    var varsLength:uint = vars.length / 2;

    for (var i:uint = 0; i<varsLength; i++)
    {
        ini[i] = mc[vars[2 * i]];
    }

    function animateEasing()
    {
        checker++;
        if (compare(mc[vars[0]]+(0.25 * (vars[1] - ini[0])) / ((1 + accelNum) * (1 + accelNum)),vars[1]))
        {
            var end = new Date();
            trace("Time lapse: "+(end - startD));

            clearInterval(iSquareEasingInterval);
            accelNum = 0;
            jerkNum = 0;
            for (var j:uint = 0; j<varsLength; j++)
            {
                mc[vars[2 * j]] = vars[(2 * j) + 1];
            }
            return;
        }
        for (var k:uint = 0; k<varsLength; k++)
        {
            mc[vars[2*k]] +=  (0.26 * (vars[(2*k)+1] - ini[k])) / ((1 + accelNum) * (1 + accelNum));
        }
        accelNum += 0.150+(jerkNum*jerkNum*jerkNum);
        jerkNum +=  0.09;
    }
    function compare(a:Number,b:Number)
    {
        if (vars[1]>ini[0])
        {
            return a>b;
        }
        else if (vars[1]<ini[0])
        {
            return a<b;
        }
    }
    var startD = new Date();
    iSquareEasingInterval = setInterval(animateEasing,20);
};

1 个答案:

答案 0 :(得分:1)

问题是,当发生任何鼠标悬停或鼠标移出事件时,您正在调用相同的方法squareEaseOut。由于您将鼠标立即从一个影片剪辑移动到另一个影片剪辑,因此相同的方法会被调用两次,首先是鼠标输出(对于旧影片剪辑),然后是鼠标悬停在新影片剪辑上。这不会导致正确的行为,因为第二个调用将覆盖第一个调用,因为您正在使用setInterval并在每次调用时清除间隔。

虽然可能有多种方法可以解决这个问题,但最简单的方法是使用单独的鼠标输出和鼠标悬停方法,尽管这可能导致一些代码重复。或者,您可以等待第一个动画完成,然后再调用另一个动画。

您还可以查看可用于实现所需内容的各种补间库,但这不是我在此处做广告的内容。

希望这有帮助。