在actionscript中处理MouseOver和MouseOut的正确方法是什么?

时间:2014-03-19 14:09:47

标签: actionscript-3 flash mouseover mouseout

这感觉应该是显而易见的,但我在使用actionscript中的一系列动画片段处理MouseEnter和MouseOut时遇到了问题。

我有一个用作背景的动画片段。在那个背景下,我添加了一个额外的动画片段作为按钮。在该按钮的MouseEnter上,我添加了一个额外的动画片段作为hoverstate,并删除了初始按钮。在MouseOut上,我删除了hoverstate按钮,并读取原始的普通按钮。

90%的时间,它按预期工作。但是其他10%的时间,在MouseOut上,MouseEnter事件会触发,即使你的鼠标不再出现在按钮上,它也会让你做上风。

一些代码要说明,这是我首先添加的主要动画片段:

package  {
import flash.display.MovieClip;

public class Menu_Main extends MovieClip {

    var backdrop:Backdrop;

    public function Menu_Main() {
        backdrop = new Backdrop();
        addChild(backdrop);
    }
}

}

这是我的后续movieclip逻辑,处理我的菜单按钮:     包{

import flash.display.MovieClip;
import flash.events.MouseEvent;

public class Backdrop extends MovieClip {

    var button:MyMenuButton;
    var button_hover:MyMenuButton_Over;

    public function InitializeButton()
    {
        button = new MyMenuButton();

        button.addEventListener(MouseEvent.MOUSE_OVER, Button_MouseOver);
        addChild(button);
    }

    function Button_MouseOver(event:MouseEvent):void
    {
        removeChild(button);

        button_hover = new MyMenuButton_Over();
        button_hover.addEventListener(MouseEvent.ROLL_OUT, ButtonHover_MouseOut);
        addChild(button_hover);
    }

    function ButtonHover_MouseOut(event:MouseEvent):void
    {
        removeChild(button_hover);
        addChild(button);
    }

    public function Backdrop() {

        InitializeButton();

    }
}

}

此处的代码不包括我在适当的位置删除EventListeners的尝试。无论添加和删除EventListeners的组合如何,结果都是相同的。我还尝试了一些ROLL_OUT和ROLL_OVER的组合,而不是鼠标版本。我不能说我已经完美地使用了它们,但结果又是一样的。

任何人都可以就处理此问题的正确方法提出一些建议吗?

2 个答案:

答案 0 :(得分:1)

两件事:首先,我使用Flash CS5.5和FlashDevelop尝试了您的代码,并且看到您描述的没有问题。该按钮对我来说效果很好(在旧的P4机器上)。

其次,使用少量代码和少量MovieClip可以实现相同的性能。 制作一个带两个框架的按钮MC。在fr中以不同方式为按钮的主体着色。 2比fr。 1。

使用相同的主类。背景课现在看起来像这样:

package
{

 import flash.display.MovieClip;
 import flash.events.MouseEvent;

 public class Backdrop extends MovieClip {

 var button:MyMenuButton;
 var button_hover:MyMenuButton_Over;

public function Backdrop() 
{
   InitializeButton();
}

 public function InitializeButton()
 {
    button = new MyMenuButton();
    button.stop();
    button.addEventListener(MouseEvent.MOUSE_OVER, Button_Over);
    addChild(button);
 }

 function Button_Over(event:MouseEvent):void
 {
    button.gotoAndStop(2);        
    button.addEventListener(MouseEvent.MOUSE_OUT, Button_Out);
 }

 function Button_Out(event:MouseEvent):void
 {
    button.gotoAndStop(1);    
 }

}

}

答案 1 :(得分:0)

这是因为Action Script中的事件不是同步的。

此处的最佳做法是添加一个透明按钮,您将在其上添加所需的所有侦听器 - ROLL_OVER和ROLL_OUT。在每个处理程序上 - 执行您想要执行的操作 - 添加或删除子项,这并不重要,因为调度事件的实际目标仍然存在并且它仍然相同。

干杯!