0

我在库中有一个movieclip,它在文档类的actionscript 中动态添加到舞台。此影片剪辑包含许多子图像,这些子图像是直接从 Photoshop 导入的原始位置(必须保留)。

我不想手动命名每一个图像实例,因为有几十个。

我已经完成并手动将图像转换为符号,因为显然 flash 不会将“位图”对象识别为 AS3 中父动画剪辑的子对象(numChildren 看不到位图,但它会看到符号)。

我有一个数组,里面有几十个孩子的引用,我循环遍历它,检查点击时是否每个孩子都在鼠标下方。但是,不知何故,除非我手动命名子符号(我通过手动命名其中一些进行测试——那些对点击敏感) ,否则它不会检测到我何时单击项目。

我已经完成trace()了整个代码的调试,验证了我的数组是否充满了数据,数据实际上是实例的名称(自动命名,IE instance45、instance46、instance47 等),验证了函数在单击时运行,如果我手动命名符号,则验证代码是否正常工作。

任何人都可以看到出了什么问题,或者我无法理解闪存的哪些方面?

这是代码:

    //check each animal to see if it was clicked on
    private function check_animal_hits():void
    {


        var i:int = 0;
        var animal:Object = this.animal_container;

        for (i=0; i<animal.mussels.length; i++)
        {

            if (this.instance_under_cursor(animal.mussels[i].name))
            {

                var animal_data = new Object();
                animal_data.animal = "mussel";
                this.send_data(animal_data);

            }
        }


    }

这是该instance_under_cursor()方法的代码:

    // Used for finding out if a certain instance is underneath the cursor the instance name is a string 
    private function instance_under_cursor(instance_name)
    {
        var i:Number;
        var pt:Point = new Point(mouseX,mouseY);
        var objects:Array = stage.getObjectsUnderPoint(pt);
        var buttons:Array = new Array  ;
        var o:DisplayObject;
        var myMovieClip:MovieClip;


        // add items under mouseclick to an array
        for (i = 0; i < objects.length; i++)
        {
            o = objects[i];
            while (! o.parent is MovieClip)
            {
                o = o.parent;
            }
            myMovieClip = o.parent as MovieClip;

            buttons.push(myMovieClip.name);
        }


        if (buttons.indexOf(instance_name) >= 0)
        {
            return true;
        }



        return false;
    }

更新:

我相信我已经将其范围缩小到getObjectsUnderPoint() 无法检测到对象的问题,除非它们是手动命名的。

4

1 回答 1

0

这是在鼠标指针下查找对象的最奇怪的方法......有一个内置函数可以做到这一点。但是,除此之外,您可能不应该依赖实例名称,因为它们无关紧要/可以更改/仅出于历史原因保留。使用此属性的代码需要重构。

但是,您观察到的情况可能是这样的:当您在 Flash CS 中将图像放在场景中时,Flash 会尝试通过将它们全部缩小为使用位图填充的形状来优化它。一旦将它们转换为符号,它将无法执行(因为它假定您以后要使用它们),但它将创建 Bitmpas - Bitmap 不是交互式对象 - 即它不注册鼠标事件- 将它添加到从 getObjectsUnderPoint() 返回的内容中毫无意义。显然,您想要做的是使它们具有交互性——例如 Sprite。因此,您对作为 MovieClip 的父级的测试没有抓住重点——因为父级不需要是 MovieClip(可以是 Sprite 或 SimpleButton 或 Loader)。

但是,如果您可以解释您需要该instance_under_cursor功能的用途,那么可能会有更好的方法来完成它的本意。

于 2012-05-13T11:57:31.953 回答