鼠标移动时激活循环

时间:2011-03-17 19:34:35

标签: actionscript loops menu mouse move

我只是要解释一下背景,以便更清楚。

我制作了这个菜单:my menu

我希望对同一菜单进行改进和更高级的版本。

我在咖啡的表面上制作了一个波浪动画,我希望在鼠标移动时让它循环,并在不移动时停止循环。

很抱歉缺乏规格,因为我对动作脚本很新,但我希望有人能够帮助我。 :)

谢谢, 马修

2 个答案:

答案 0 :(得分:1)

嗯,你说过 - 利用MouseEvent.MOUSE_MOVE在你的循环例程中设置一个条件。

    private var _isMoving:Boolean = false;

    stage.addEventListener(MouseEvent.MOUSE_MOVE, checkMouse);
    this.addEventListener(Event.ENTER_FRAME, doLoop);

    private function checkMouse(e:MouseEvent):void 
    {
        _isMoving = true;
    }
    private function doLoop(e:Event):void 
    {
        trace("moving =" + _isMoving);

         if(_isMoving)
         {
           // loop animation
         }

        _isMoving = false;
    }

答案 1 :(得分:0)

取决于您希望它如何工作,我将按如下方式执行此操作:

     
  1. 制作波浪咖啡的动画  
  2. 确保动画循环   
       
    • 请注意默认情况下剪辑循环播放,因此您只需匹配第一帧和最后一帧即可!
     
  3. 将剪辑放在当前咖啡图形的边缘  
          
    • 双击图形进行编辑     
    • 将循环动画的实例从库中拖动到图形的“边缘”     
    • 或者只需用循环的动画替换整个浅棕色图形  
     
  4. 当鼠标移动时,在动画循环剪辑上调用play  
  5. 当鼠标停止时,在动画循环剪辑上调用stop

一些示例代码将遵循:

    public function init():void {
        menuClip.addEventListener(MouseEvent.MOUSE_OVER, onMenuRollOver);
        menuClip.addEventListener(MouseEvent.MOUSE_OUT, onMenuRollOut);
    }

    public function onMenuRollOver(event:MouseEvent):void {
        stage.addEventListener(MouseEvent.MOUSE_MOVE, onMove);
        /* do the stuff you're currently doing to animate the clip here.
        something like: coffee graphic height = ease to mouseHeight */

    }

    public function onMenuRollOut(event:MouseEvent):void {
        /* do the stuff you're currently doing to stop the clip here. */
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, onMove);
        coffeeClip.stop();
    }

    public function onMove(event:MouseEvent):void {
        resetTimer();
        coffeeClip.play(); //note: play has no effect when movie is playing (that's ideal in this case)
    }

    public function resetTimer():void {
        if(mouseMovementTimer == null) createTimer();
        mouseMovementTimer.reset();
        mouseMovementTimer.start();
    }

    public function createTimer():Timer {
        mouseMovementTimer = new Timer(DELAY, 1); //fiddle with the delay variable. Try 500, at first
        mouseMovementTimer.addEventListener(TimerEvent.TIMER, stopAnimationLoop);
    }

    public function stopAnimationLoop(event:TimerEvent):void {
        mouseMovementTimer.removeEventListener(TimerEvent.TIMER, stopAnimationLoop); //optional but recommended
        mouseMovementTimer = null;
        coffeClip.stop();
    }

当然,你需要做一些事情,比如调用init()和导入flash.utils.Timer并初始化变量,如mouseMovementTimer,menuClip,coffeeClip和DELAY。

警告:此代码不在我的头顶且未经测试。因此,它可能存在小错误但你应该得到一般的想法:

  • 当用户将鼠标悬停在菜单上时添加鼠标侦听器
  • 如果用户将鼠标移出菜单
  • ,则删除该侦听器
  • 让该侦听器播放循环影片剪辑
  • 触发一个事件,如果在一段时间内未检测到移动,将停止循环剪辑
  • 触发后,停止剪辑
  

关键是检测鼠标何时停止移动。 Flash可以很好地检测交互,但由于显而易见的原因,它不会检测到非交互。解决这个问题的一个简单方法是触发一个计时器,该计时器将在上次活动后经过太多时间后关闭。然后,当计时器触发时,您知道操作已停止!

我认为这是解决问题的关键因素。我希望以某种方式帮助某人。

〜gmale