【问题标题】:Add an array of Movie Clips to a filter ActionScript 3将一组影片剪辑添加到过滤器 ActionScript 3
【发布时间】:2011-11-02 10:23:30
【问题描述】:

我将 8 个 mc 存储在一个数组中,然后将它们放在舞台上。 现在我想对这些 mc 应用模糊效果。 我的问题是我不知道如何通过单击为每个 mc 应用模糊效果。 因此,例如,我在舞台上拥有所有 mc,如果我单击其中一个,则单击的那个应该具有模糊效果,依此类推。 如何将过滤器应用于mc? 谢谢你的时间

【问题讨论】:

    标签: actionscript-3 filter effects


    【解决方案1】:

    您可以遍历 mc 的数组并在每个数组上添加事件侦听器:

    var mcArrayLength:int = mcArray.length();
    for (var i:int = 0; i < mcArrayLength; i++) {
      var mc:MovieClip = mcArray[i] as MovieClip;
      mc.addEventListener(MouseEvent.CLICK, onMcClick);
    }
    

    和事件处理程序:

    function onMcClick(e:MouseEvent):void
    {
      var clickedMc:MovieClip = e.currentTarget as MovieClip;
      clickedMc.filters = [myBlurFilter];
    }
    

    当然,如果您希望一次只有一个模糊的 mc,您应该保留对它的引用并在单击另一个 mc 时删除模糊:

    var currentlyClickedMc:MovieClip;
    
    function onMcClick(e:MouseEvent):void
    {
      var clickedMc:MovieClip = e.currentTarget as MovieClip;
      clickedMc.filters = [myBlurFilter];
      if (currentlyClickedMc) currentlyClickedMc.filters = [];
      currentlyClickedMc = clickedMc;
    }
    

    【讨论】:

    • 这段代码有错误吗?您是否正确定义了BlurFilter 的属性以查看单击的 MC 的视觉差异?你能显示完整的源代码吗?
    • 我已经做到了。我对“currentTarget”和“.target”有疑问,所以它只有在我使用“target”而不是“currentTarget”时才有效。你能解释一下如何为我的 mc 做父母吗?我的意思是被点击的mc应该在前台。
    • 假设您的 MC 有一个名为 container 的父级。在这种情况下,每次单击 MC 时,您都应该将此 MC 重新添加到父级(这会将 MC 移动到显示列表的顶部)。此代码应进入onMcClick 函数:container.addChild(clickedMc)
    • 你能告诉我如何为每个 mc 分配一个数字,因为当 mc 在网格上的顺序正确时,应该显示一些东西。或者如果你有一个想法我该怎么做谢谢你
    • 对不起,我不明白你想要达到什么目的。但是对于简单的编号,可以将MC的name属性设置为想要的编号,转换为String,例如:myMC.name = myNumber.toString();
    【解决方案2】:

    这样的东西(未经测试)应该可以工作:

    package
    {
        //Imports
        import flash.events.MouseEvent;
        import flash.filters.BlurFilter;
    
        //Class
        public function ClickToBlur
        {
            //Variables
            private var clickableObjects:Array;
    
            //Constructor
            public function ClickToBlur(clickableObjects:Array)
            {
                this.clickableObjects = clickableObjects;
    
                init();
            }
    
            //Initialize
            private function init():void
            {
                for each (var object:Object in clickableObjects)
                {
                    object.addEventListener(MouseEvent.CLICK, clickMouseEventHandler);
                }
            }
    
            //Click Mouse Event Handler
            private function clickMouseEventHandler(evt:MouseEvent):void
            {
                if (evt.currentTarget.filters == [])
                {
                    evt.currentTarget.filters = [new BlurFilter()];
                }
                else
                {
                    evt.currentTarget.filters = [];
                }
            }
    
            //Dispose
            public function dispose():void
            {
                for each (var object:Object in clickableObjects)
                {
                    object.removeEventListener(MouseEvent.CLICK, clickMouseEventHandler);
                }
            }
        }
    }
    

    只需将数组传递给类的新实例

    var ctb:Object = new ClickToBlur(myArrayOfObjects);
    

    完成后清理:

    ctb.dispose();
    

    因为它们都是电影剪辑,所以你应该使用向量而不是数组。

    【讨论】:

    • 你有一个=,你想要一个==
    • 已修复 ;)... 但仍未经测试:p
    猜你喜欢
    • 2012-02-04
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2020-01-09
    相关资源
    最近更新 更多