flash - 由于影片剪辑重叠导致的 AS3 MOUSE_OVER 问题

原文 标签 flash actionscript-3 flash-cs4

我正在研究屏幕上有很多不同按钮的东西。按钮需要使用影片剪辑制作,而不是实际的“按钮”。

我正在使用 Flash CS4 和 ActionScript 3。

我在鼠标悬停时在按钮周围创建了发光效果。这很好用,除了发光效果为按钮创建一个大约两倍于实际按钮宽度和高度的碰撞盒。我做了一些研究,最终在按钮符号内创建了一个符号,该符号仅包含我想要触发按钮的点击区域。这非常适合触发按钮。现在,当我将鼠标悬停在按钮上时,它们只会在我点击实际按钮图形本身时亮起,而不是发光动画中围绕它的框。然而,问题是由于某种原因,动画中的框仍然阻止鼠标悬停在附近的按钮上被检测到(如果框与它们重叠。)

这可能听起来令人困惑,所以这是一张图片:

enter image description here

  • 绿色区域定义鼠标激活发光的位置
    动画片。
  • 红色区域定义发光动画符号的实际框。
  • 黄色区域定义了按钮的不
    激活发光动画,因为红色框挡住了
    鼠标悬停事件被触发。
  • 我省略了左侧按钮的红色框以便更容易地看到问题,但是请注意,实际上两个按钮周围都有这些框之一,右侧的按钮只是放在左侧按钮之后的舞台,导致其框位于左侧按钮的顶部。

  • 注意:点击区域和动画都已经包含在按钮符号内的它们自己的单独符号中。将动画符号的 mouseEnabled 和 mouseChildren 设置为 false 似乎并没有像我希望的那样做(基于对这个问题的研究。)

    注意:当鼠标移动到红色区域时动画不会激活(也不应该),它只在鼠标移动到绿色区域时激活,这是所需的行为,唯一的问题是我根本不希望鼠标事件检测到红色框。

    这是按钮类的代码:
    package classes{
    
        import flash.display.MovieClip;
        import flash.events.MouseEvent;
        import flash.events.Event;
        public class glowing_place_marker extends MovieClip {
    
            public static var instances:Array = new Array();
            public var is_playing:Boolean=false;
            private var is_mouse_over:Boolean = false;
            private var animation:MovieClip;
    
            public function glowing_place_marker() {
    
                this.animation = this.place_marker_animation;
                this.animation.stop();
                this.animation.mouseEnabled = false;
                this.animation.mouseChildren = false;   
    
                self:instances.push(this);
                this.place_marker_hit.addEventListener(MouseEvent.MOUSE_OVER, roll_over_handler);
                this.place_marker_hit.addEventListener(MouseEvent.MOUSE_OUT, roll_out_handler);
    
            }
    
            public function roll_over_handler(e:MouseEvent) {
                this.animation.play();      
                this.is_playing=true;
                this.is_mouse_over = true;
    
            }
    
            public function roll_out_handler(e:MouseEvent) {
    
                stage.addEventListener(Event.ENTER_FRAME, checkFrame);
                this.is_mouse_over = false;
            }
    
            function checkFrame(event:Event):void {
                if (!this.is_mouse_over) {
                    if (this.animation.currentFrame==1) {
                        stage.removeEventListener(Event.ENTER_FRAME, checkFrame);   
                        this.animation.stop();              
                        this.is_playing = false;
    
                    }
                }
            }
    
        }
    
    }
    

    谁能向我解释如何获得动画的框(红色框),而不是阻止它下面的按钮? (有效地使鼠标事件无法检测到红色框,因此单击、鼠标悬停等直接通过它到达下面的项目。)

    先感谢您。

    最佳答案

    尝试设置 mouseEnabled = false在容器上DisplayObject (带有发光的那个)包含按钮的点击区域。你还是想离开 mouseChildren = true .这样,辉光不应再阻止鼠标事件。

    关于mouseEnabled有用的东西和 mouseChildren是您可以选择仅禁用容器,或仅禁用容器的子项。

    这是一个很好的阅读:

    The power and genius of mouseChildren and mouseEnabled

    关于flash - 由于影片剪辑重叠导致的 AS3 MOUSE_OVER 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8483542/

    相关文章:

    flash - SampleDataEvent.data.writeFloat() - 为什么调用它两次?

    javascript - 是什么触发了ie中对象标签的onerror事件处理程序?

    apache-flex - 如何使自定义 AS3 类可用于数据绑定(bind)?

    flash - 有非官方的 Flash .FLA 规范吗?

    actionscript-3 - 如何在 ActionScript 3 中获取用户的屏幕分辨率?

    actionscript-3 - FLASH AS3声音重叠

    wcf - WCF 是 Fl​​ash 游戏的好后端吗?

    actionscript-3 - 在 Actionscript 3.0 中读取包下的所有类或读取具有相同元数据的类

    javascript - ActionScript3 (AS3) 对 javascript/jquery 函数的外部接口(interface)调用不起作用

    flash-cs4 - 在Adobe Flash Professional CS5中将文本转换为矢量形状